1 回答
TA贡献1827条经验 获得超7个赞
对字符串使用默认排序将使用字典顺序,而您打算按数字顺序对字符串进行排序(如果第一个数字相等,则按第二个数字排序)。实现此目的的一种方法是使用两个比较器:
List<String> list = new ArrayList<>(Arrays.asList("96-1","91","94-2","100-2","94-1","95"));
System.out.println("Unsorted: "+list);
Comparator<String> primaryComparator =
(a,b)->Integer.valueOf(a.split("-")[0])
.compareTo(Integer.valueOf(b.split("-")[0]));
Comparator<String> secondaryComparator =
(a,b)->Integer.valueOf(a.split("-")[1])
.compareTo(Integer.valueOf(b.split("-")[1]));
list.sort(primaryComparator.thenComparing(secondaryComparator));
System.out.println("Sorted: "+list);
list.sort(primaryComparator.thenComparing(secondaryComparator).reversed());
System.out.println("Sorted in reverse: "+list);
至于比较器本身,我假设列表中的字符串始终有效,并且始终采用 形式\d+(-\d+)?,因此要么是一个整数,要么是两个用连字符分隔的整数。(如果不是这种情况,您可能需要使用自定义 Java 7 样式比较器添加一些额外的检查/验证,以使其比 Java 8 样式的 lambda 更具可读性。)
/.split("-")[0]将.split("-")[1]在连字符上拆分此字符串,并根据比较器获取第一个或最后一个整数。然后它会将其转换为带有 的整数Integer.valueOf(...),并将使用内置的默认整数进行比较Integer1.compareTo(Integer2)。
添加回答
举报