Java中如何修改排序规则实现分级字符串的指定逆序排序?
实现父节点优先的路径排序
嘿,我明白你的问题了——你想要的是父节点优先于它的子节点,同时顶层节点按逆序排列(K2在K1前面),而不是单纯按字符串字典序逆序。原来的Comparator.reverseOrder()会把更长的路径(比如K2\SK1\SSK1)排在父节点K2前面,因为字符串字典序比较时,K2\...的字符序列比K2更长且后续字符的ASCII值更大,导致逆序后子节点反而靠前。
解决方案:自定义路径比较器
我们需要编写一个自定义的Comparator,核心逻辑是:
- 先按顶层节点逆序排序(K2 > K1);
- 若顶层节点相同,则按路径长度升序排序(父节点路径更短,所以排在子节点前面)。
以下是完整的代码实现:
import java.util.Arrays; import java.util.Comparator; public class PathSortExample { public static void main(String[] args) { String[] subdivisions = {"K1","K1\\SK1","K2","K2\\SK1\\SSK1"}; // 自定义路径比较器 Comparator<String> pathPriorityComparator = (s1, s2) -> { // 按反斜杠拆分路径,注意转义符:\\ 表示实际的 \ String[] nodes1 = s1.split("\\\\"); String[] nodes2 = s2.split("\\\\"); // 第一步:比较顶层节点,逆序排列 int topLevelCompare = nodes2[0].compareTo(nodes1[0]); if (topLevelCompare != 0) { return topLevelCompare; } // 第二步:顶层节点相同时,路径短的排前面(父节点优先) return Integer.compare(nodes1.length, nodes2.length); }; // 应用排序并输出 Arrays.stream(subdivisions) .sorted(pathPriorityComparator) .forEach(System.out::println); } }
代码运行结果
运行这段代码后,你会得到期望的输出:
K2 K2\SK1\SSK1 K1 K1\SK1
扩展:处理同层级子节点排序
如果你的场景中存在同层级的子节点(比如K2\SK1和K2\SK2),可以在比较器中添加第三层逻辑,按子节点的字典序排序(正序或逆序按需调整):
Comparator<String> pathPriorityComparator = (s1, s2) -> { String[] nodes1 = s1.split("\\\\"); String[] nodes2 = s2.split("\\\\"); int topLevelCompare = nodes2[0].compareTo(nodes1[0]); if (topLevelCompare != 0) { return topLevelCompare; } int lengthCompare = Integer.compare(nodes1.length, nodes2.length); if (lengthCompare != 0) { return lengthCompare; } // 第三步:同层级节点按字典序逆序(可按需改为正序) for (int i = 1; i < nodes1.length; i++) { int nodeCompare = nodes2[i].compareTo(nodes1[i]); if (nodeCompare != 0) { return nodeCompare; } } return 0; };
内容的提问来源于stack exchange,提问作者Руслан Иванов
相关产品推荐
相关产品推荐

