我已经知道我们可以用数字方式对字符串数组进行排序,方法是将它们转换为整数数组,然后使用Arrays.sort()
或使用任何比较器。
所以我的问题是,如果这些字符串超出了整数或长整数的限制,那么我们如何对它们进行排序。例如,考虑以下字符串数组:
14829435897932384626433832795
4159265358979323846264338327
1937286535897932384626433832795296523
23746289
在这些情况下,传统的比较器或任何排序方法都不起作用,因为它们反过来使用整数(或任何其他数据类型)。
答案 0 :(得分:8)
根据Eran的建议:转换为BigInteger
并进行比较:
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
BigInteger bi1 = new BigInteger(o1);
BigInteger bi2 = new BigInteger(o2);
return bi1.compareTo(bi2);
}
});
因为@tobias_k并不关心业力:
如果您正在运行Java 8,则可以使用Comparator
接口的许多新默认方法在一行中执行此操作:
Arrays.sort(arr, Comparator.comparing(BigInteger::new))
只需在Comparator
添加了一个计数器,即可查看String
转换为BigInteger
的次数。它在我简单的4个字符串中计算了10次转换。
这让我觉得通过转换每个字符串一次,对BigInteger
实例进行排序并将其转换回来可能会带来性能提升。像这样:
List<BigInteger> list1 = list.stream().map(BigInteger::new)
.sorted().collect(Collectors.toList());
答案 1 :(得分:7)
您可以使用Arrays.sort(array, comparator)
Arrays.sort(array, Comparator.comparing(BigInteger::new));
comparator
可以parameter
a function maps
一个对象进入另一个对象(此处为String into BigInteger
)有详细信息(从较短到较长,Intellij将建议您使用第一个)::
= Comparator.comparing(BigInteger::new)
= Comparator.comparing(val -> new BigInteger(val))
= Comparator.comparing((o1, o2) -> new BigInteger(o1).compareTo(new BigInteger(o2)))
String[] array = new String[]{"14829435897932384626433832795",
"4159265358979323846264338327",
"1937286535897932384626433832795296523", "23746289"};
Arrays.sort(array, Comparator.comparing(BigInteger::new));
System.out.println(Arrays.toString(array));
//Will result in
[23746289, 4159265358979323846264338327, 14829435897932384626433832795, 1937286535897932384626433832795296523]
答案 2 :(得分:3)
您还可以创建自定义比较器:
List<String> list = Arrays.asList("14829435897932384626433832795", "4159265358979323846264338327", "1937286535897932384626433832795296523", "23746289", "4159265358979323846264338326");
// comparing by String if the length is equal
Collections.sort(list, Comparator.comparingInt(String::length).thenComparing(String::compareTo));
System.out.println(list);
输出:
[23746289,4159265358979323846264338326,4159265358979323846264338327, 14829435897932384626433832795,1937286535897932384626433832795296523]