San*_*mar 2 java arrays sorting string java-8
我已经知道我们可以用数字方式对字符串数组进行排序,将它们转换为整数数组,然后使用Arrays.sort()或使用任何比较器.
所以我的问题是如果这些字符串超出了整数或长整数的限制,那么我们如何对它们进行排序.例如,考虑以下字符串数组:
14829435897932384626433832795
4159265358979323846264338327
1937286535897932384626433832795296523
23746289
Run Code Online (Sandbox Code Playgroud)
在那些情况下,传统的比较器或任何排序方法将无法工作,因为它们反过来使用整数(或任何其他数据类型).
正如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);
}
});
Run Code Online (Sandbox Code Playgroud)
因为@tobias_k不关心因果报应:
如果您正在运行Java 8,则可以使用Comparator界面的许多新默认方法在一行中执行此操作:
Arrays.sort(arr, Comparator.comparing(BigInteger::new))
Run Code Online (Sandbox Code Playgroud)
刚刚添加了一个计数器,Comparator以查看String转换为a的次数BigInteger.它在我简单的4个字符串中计算了10次转换.
这让我觉得通过转换每个字符串一次,对BigInteger实例进行排序并将其转换回来可能会带来性能提升.像这样的东西:
List<BigInteger> list1 = list.stream().map(BigInteger::new)
.sorted().collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
您可以使用 Arrays.sort(array, comparator)
Arrays.sort(array, Comparator.comparing(BigInteger::new));
Run Code Online (Sandbox Code Playgroud)
comparator可以采取作为parameter一个功能在于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)))
Run Code Online (Sandbox Code Playgroud)
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]
Run Code Online (Sandbox Code Playgroud)