数字排序String数组

时间:2017-11-14 13:51:51

标签: java arrays string sorting java-8

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

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

14829435897932384626433832795
4159265358979323846264338327
1937286535897932384626433832795296523
23746289

在这些情况下,传统的比较器或任何排序方法都不起作用,因为它们反过来使用整数(或任何其他数据类型)。

3 个答案:

答案 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));

有详细信息(从较短到较长,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]