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

Java列表按指定字母优先级+数值排序出错,求问题排查

问题描述

现有列表:(2D, 1D, 1Y, 12W, 1W, 23M, 4M, 2Y, 12D),需要按照以下规则排序:

  • 优先按字母顺序排序(顺序为 D → W → M → Y)
  • 同一字母分类下,按数值从小到大排序

预期输出:(1D, 2D, 12D, 1W, 12W, 4M, 23M, 1Y, 2Y)

尝试了以下Java代码:

import java.util.List;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Collections;
import java.util.Arrays;

public class MyClass {
    public static void main(String args[]) {
        List<String> listNew = new ArrayList<>();
        listNew.add("2D");
        listNew.add("1D");
        listNew.add("1Y");
        listNew.add("12W");
        listNew.add("1W");
        listNew.add("23M");
        listNew.add("4M");
        listNew.add("2Y");
        listNew.add("12D");
        listNew.add("1W");
        List<String> order = Arrays.asList("D", "W", "M","Y");
        listNew.sort(Comparator.comparingInt(s -> Integer.parseInt(((String) s).substring(0, ((String) s).length() - 1))).thenComparing(Comparator.comparingInt(order::indexOf)));
        for (String element : listNew) {
            System.out.println(element);
        }
    }
}

实际输出结果:

1D
1Y
1W
1W
2D
2Y
4M
12W
12D
23M

请问代码哪里出错了?

错误分析与修正

你的代码核心错误是排序优先级搞反了:
你当前的排序逻辑是先按数值从小到大排序,再按字母的优先级排序。但需求要求先按字母优先级分组,再在组内按数值排序,两者顺序完全颠倒,导致同数值的不同字母元素被排到一起,不符合预期。

另外,提取数字的部分可以简化:直接取字符串最后一位作为字母标识,前面的子串就是数字,写法更简洁易读。

修正后的代码如下:

import java.util.List;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Arrays;

public class MyClass {
    public static void main(String args[]) {
        List<String> listNew = new ArrayList<>();
        listNew.add("2D");
        listNew.add("1D");
        listNew.add("1Y");
        listNew.add("12W");
        listNew.add("1W");
        listNew.add("23M");
        listNew.add("4M");
        listNew.add("2Y");
        listNew.add("12D");
        listNew.add("1W");
        List<String> order = Arrays.asList("D", "W", "M", "Y");
        
        // 先按字母优先级排序,再按数值从小到大排序
        listNew.sort(Comparator.comparingInt((String s) -> order.indexOf(s.substring(s.length() - 1)))
                .thenComparingInt(s -> Integer.parseInt(s.substring(0, s.length() - 1))));
        
        for (String element : listNew) {
            System.out.println(element);
        }
    }
}

运行后输出符合预期:

1D
2D
12D
1W
1W
12W
4M
23M
1Y
2Y

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 14:16:27