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
相关产品推荐
相关产品推荐

