使用Comparator的字符串排序数组(特定排序情况)



我在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]

相关内容

最新更新