Java中如何对带连字符前缀的字符串按字母顺序正确排序
解决方法
你当前的问题是直接对拼接了连字符的字符串做默认字典序排序,排序逻辑会优先比较前缀的连字符,自然无法得到预期的按字母排序的结果。可以用以下两种方案解决:
方案1:先存储字母和对应层级,排序后再生成输出字符串(更推荐,逻辑更清晰)
不要提前把连字符拼到字符串里,先记录每个字符对应的缩进层级,按字符排序后再拼接连字符输出,还能避免重复存储同一个字母的两次出现:
import java.util.ArrayList; import java.util.Comparator; public class Main { // 内部类存储字符和对应的缩进层级 static class CharWithLevel { char c; int level; public CharWithLevel(char c, int level) { this.c = c; this.level = level; } } public static void main(String[] args) { String input = "abccbdeeda"; System.out.println("input: " + input); char[] chars = input.toCharArray(); ArrayList<Character> stack = new ArrayList<>(); ArrayList<CharWithLevel> resultList = new ArrayList<>(); int level = 0; boolean isSecondOccur; stack.add(chars[0]); resultList.add(new CharWithLevel(chars[0], level)); for (int i = 1; i < chars.length; i++) { isSecondOccur = stack.contains(chars[i]); if (isSecondOccur) { stack.remove((Character) chars[i]); level--; } else { level++; stack.add(chars[i]); resultList.add(new CharWithLevel(chars[i], level)); } } // 按字母升序排序 resultList.sort(Comparator.comparingInt(o -> o.c)); // 输出结果 for (CharWithLevel item : resultList) { System.out.println("-".repeat(item.level * 2) + item.c); } } }
方案2:自定义排序规则,最小改动兼容现有代码
如果你不想调整现有逻辑结构,只需要把原来的Arrays.sort(strSplit);替换为自定义比较器的排序逻辑,排序时提取字符串末尾的字母做比较即可:
Arrays.sort(strSplit, (s1, s2) -> { char c1 = s1.charAt(s1.length() - 1); char c2 = s2.charAt(s2.length() - 1); return Character.compare(c1, c2); });
两种方案都可以得到你预期的输出结果。
内容的提问来源于stack exchange,提问作者island
相关产品推荐
相关产品推荐

