数字排序String数组

San*_*mar 2 java arrays sorting string java-8

我已经知道我们可以用数字方式对字符串数组进行排序,将它们转换为整数数组,然后使用Arrays.sort()或使用任何比较器.

所以我的问题是如果这些字符串超出了整数或长整数的限制,那么我们如何对它们进行排序.例如,考虑以下字符串数组:

14829435897932384626433832795
4159265358979323846264338327
1937286535897932384626433832795296523
23746289
Run Code Online (Sandbox Code Playgroud)

在那些情况下,传统的比较器或任何排序方法将无法工作,因为它们反过来使用整数(或任何其他数据类型).

Hen*_*sen 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);
    }
});
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)

  • Java 8:`Arrays.sort(arr,Comparator.comparing(BigInteger :: new))` (2认同)

azr*_*zro 7

您可以使用 Arrays.sort(array, comparator)

Arrays.sort(array, Comparator.comparing(BigInteger::new));
Run Code Online (Sandbox Code Playgroud)

随着细节(从较短到较长,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)