You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 16:48:03