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());
您可以使用数组。排序(数组、比较器)
可以将比较器
一个对象映射到另一个对象(此处)
您还可以创建自定义比较器:
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!你应该加上这个作为答案。嗯,基本上是一样的。如果您愿意,可以随意将其添加到您的中。如上所述,只有在没有前导零的情况下,它才有效。但我们可以假设,这是最有效的+1Arrays.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);