我在Java中有以下字符串数组
输入字符串
List<String> list = Arrays.asList("01", "1", "2", "001", "002", "3", "6", "06", "006", "0001", "7");
预期输出
{"0001","001", "01", "1", "002", "2", "3", "006", "06", "6", "7"}
比较器的正确实现是什么?我有以下算法实现,但我怀疑这将不工作使用值"001"多于两个字符:
Arrays.sort(list, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
Integer position = 0;
char[] firstArray = o1.toCharArray();
char[] secondArray = o2.toCharArray();
for (int i = 0; i < firstArray.length; i++) {
if (firstArray[i] != secondArray[i]) {
position = i;
break;
}
}
return Integer.valueOf(o1.charAt(position)).compareTo(Integer.valueOf(o2.charAt(o2.length() - 1)));
}
});
这会产生以下输出,看起来0的出现率更高。
实际输出
[0001, 001, 002, 006, 01, 06, 1, 2, 3, 6, 7]
如有任何帮助,不胜感激。
感谢首先,Arrays.sort
不能编译,因为list
是一个集合,所以应该使用Collections.sort(list, customComparator)
或仅使用list.sort(customComparator)
。
第二,使用当前比较器实现排序的结果是:
[0001, 001, 002, 006, 01, 06, 1, 2, 3, 6, 7]
也就是说,首先对按String的反向长度排序,然后对按值排序,所以这两个排序的顺序应该是颠倒的。
例如:
list.sort(
Comparator.<String>comparingInt(Integer::parseInt)
.thenComparing(String::length, Comparator.reverseOrder())
);
System.out.println(list);
提供预期的输出:
[0001, 001, 01, 1, 002, 2, 3, 006, 06, 6, 7]