Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对字符串数组进行数字排序_Java_Arrays_String_Sorting_Java 8 - Fatal编程技术网

Java 对字符串数组进行数字排序

Java 对字符串数组进行数字排序,java,arrays,string,sorting,java-8,Java,Arrays,String,Sorting,Java 8,我已经知道,通过将字符串数组转换为整数数组,然后使用arrays.sort()或使用任何比较器,可以对字符串数组进行数字排序 所以我的问题是,如果这些字符串超出了整数或长整数的限制,那么我们如何对它们进行排序。例如,考虑以下字符串数组: 14829435897932384626433832795 4159265358979323846264338327 1937286535897932384626433832795296523 23746289 在这些情况下,传统的比较器或任何排序方法都无法工

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

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

14829435897932384626433832795
4159265358979323846264338327
1937286535897932384626433832795296523
23746289

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

按照Eran的建议:转换为
biginger
,并进行比较:

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);
    }
});

刚刚在
比较器
中添加了一个计数器,以查看
字符串
转换为
大整数
的次数。在我简单运行的4个字符串中,它计算了10次转换

这让我想到,通过将每个字符串转换一次,对
biginger
实例进行排序并将其转换回,可能会提高性能。大概是这样的:

List<BigInteger> list1 = list.stream().map(BigInteger::new)
     .sorted().collect(Collectors.toList());
List list1=List.stream().map(BigInteger::new)
.sorted().collect(Collectors.toList());

您可以使用
数组。排序(数组、比较器)

  • 比较器
    可以将
    一个对象映射到另一个对象(此处)
详细信息(从短到长,Intellij将建议您使用第一个):



您还可以创建自定义比较器:

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);
List List=Arrays.asList(“1482943587932384626433832795”、“4159265358979323846264338327”、“19372865358979323846264383279529523”、“23746289”、“41592653589323846264338326”);
//如果长度相等,则按字符串进行比较
Collections.sort(list,Comparator.comparingInt(String::length)。然后比较(String::compareTo));
系统输出打印项次(列表);
输出:

[2374628941592653589793238462643383264159265358979323846264338327, 14829435879323846264338327951937286535897932384626433832795296523]


将它们转换为BigInteger选项1:BigInteger选项2:首先按长度进行比较,如果长度相等,则比较为字符串
BigInteger
似乎是一个更好的选项,特别适用于
字符串可以以一组零开始的情况,例如
00013124953
。这里的长度比较会有问题。是的,biginteger似乎更好。谢谢@Eran、@GaborSch、@Everyone我更喜欢选项2(比较字符串长度,然后比较为字符串)和跳过任何前导零的比较器。这可能会更有效,因为您不会创建新对象并分配数组来保存BigInteger值。如果可读性是唯一的要求,那么就使用biginger.Java 8:
Arrays.sort(arr,Comparator.comparing(biginger::new))
@tobias_k:Nice!你应该加上这个作为答案。嗯,基本上是一样的。如果您愿意,可以随意将其添加到您的中。如上所述,只有在没有前导零的情况下,它才有效。但我们可以假设,这是最有效的+1
Arrays.sort(数组,Comparator.comparingInt(字符串::长度)。然后比较(字符串::compareTo))这正是我所寻找的解决方案,它是正确且有效的,谢谢。这确实是一个伟大的解决方案,但它存在一些效率问题。@SandipKumar详细信息?^^您有很多字符串需要转换和排序?是的,我给出的只是示例,实际的字符串太大了。
Arrays.sort(array, Comparator.comparing(BigInteger::new));
= 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]
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);