我尝试使用原生sort
方法订购元素。
代码:
List<String> list = new ArrayList();
Collections.sort(list);
输入1:
Before order: 65 31 37 37 72 76 61 35 57 37
After order: 31 35 37 37 37 57 61 65 72 76
Expected: Ok.
输入2:
Before order: 45 186 185 55 51 51 22 78 64 26 49 21
After order: 185 186 21 22 26 45 49 51 51 55 64 78
Expected: 21 22 26 45 49 51 51 55 64 78 185 186
问题是该方法在某些情况下排序错误,我该如何解决?
答案 0 :(得分:5)
您有List<String>
,因此Collections.sort
按字典顺序排序String
(s)。您可以使用List<Integer>
之类的
List<Integer> al = Arrays.asList(45, 186, 185, 55, 51, 51, 22, 78, 64, 26, 49, 21);
Collections.sort(al);
System.out.println(al);
但是,如果您必须使用String
(s),那么您需要提供自定义Comparator
(因为默认String
顺序不是您的想)。像,
List<String> al = Arrays.asList("45", "186", "185", "55", "51", "51", //
"22", "78", "64", "26", "49", "21");
Collections.sort(al, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return Integer.compare(Integer.parseInt(o1), Integer.parseInt(o2));
}
});
System.out.println(al);
哪个输出(如第一个例子)
[21, 22, 26, 45, 49, 51, 51, 55, 64, 78, 185, 186]
答案 1 :(得分:0)
你应该使用整数比较器。
List<Integer> list = new ArrayList();
Collections.sort(list);
或
List<String> list = Arrays.asList(new String[]{"45", "186", "185", "55", "51", "51", "22", "78", "64", "26", "49", "21"});
Comparator<String> cmp = (String o1, String o2) -> Integer.valueOf(o1).compareTo(Integer.valueOf(o2));
Collections.sort(list,cmp);
System.out.println(list);
答案 2 :(得分:0)
你应该按
排序那是
Collections.sort(list,
Comparator.comparing(Integer::parseInt));
或按
排序那是
Collections.sort(list,
Comparator.comparing(String::length)
.thenComparing(Function.identity()));