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

如何实现基于自定义字母顺序的Java Stream全字符排序Comparator?

按自定义字符顺序对字符串列表全字符排序(Java Stream实现)

需求说明

给定字符串列表和自定义字母顺序字符串,使用Java Stream对列表排序,要求比较字符串的所有字符(而非仅首字母),规则如下:

  • 按自定义顺序中字符的位置先后排序,位置越靠前的字符对应的字符串优先级越高
  • 若两个字符串前缀完全相同,则较短的字符串排在前面

示例

  • 输入1:
    List<String> names = Arrays.asList("Robin","Zax","John"); 
    String order = "ZJR"
    
    输出1:["Zax","John","Robin"]
  • 输入2:
    List<String> names = Arrays.asList("Robin","Zax","John","Rohan"); 
    String order = "OZJRHBAS";
    
    输出2:["Zax","John","Rohan","Robin"]

问题分析

现有MyComparator的compare方法存在两个核心问题:

  1. 字符差异处理逻辑错误:通过累加proximity的方式合并所有字符的比较结果,而非找到第一个不同的字符就返回对应的顺序差值,会导致排序逻辑混乱
  2. 未处理前缀相同但长度不同的场景:当一个字符串是另一个的前缀时,没有通过长度差确定最终顺序

修正后的代码

改进版MyComparator

class MyComparator implements Comparator<String> {
    private final String order;

    MyComparator(String order) {
        this.order = order;
    }

    @Override
    public int compare(String s1, String s2) {
        int minLength = Math.min(s1.length(), s2.length());
        // 逐个字符比较,找到第一个差异字符就返回结果
        for (int i = 0; i < minLength; i++) {
            char c1 = s1.charAt(i);
            char c2 = s2.charAt(i);
            int index1 = order.indexOf(c1);
            int index2 = order.indexOf(c2);
            // 字符在自定义顺序中位置不同,直接返回索引差值
            if (index1 != index2) {
                return index1 - index2;
            }
        }
        // 前缀完全相同时,短字符串排在前面
        return s1.length() - s2.length();
    }
}

调用示例

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class CustomSortDemo {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Robin","Zax","John","Rohan");
        String order = "OZJRHBAS";
        
        List<String> sortedNames = names.stream()
                .sorted(new MyComparator(order))
                .collect(Collectors.toList());
                
        System.out.println(sortedNames); // 输出: [Zax, John, Rohan, Robin]
    }
}

代码说明

  1. 逐个字符比较:循环遍历两个字符串的每个字符,一旦找到在自定义顺序中位置不同的字符,直接返回两者的索引差值——这是符合排序逻辑的核心,优先以第一个差异字符的顺序为准
  2. 前缀相同场景处理:当循环结束(说明前面的字符完全一致),通过字符串长度的差值确定顺序,短字符串在前
  3. 细节优化:将order声明为final避免不必要的修改;提前计算最小长度减少重复计算

内容的提问来源于stack exchange,提问作者ITGeek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 12:05:18