我有一个简单的整数数组,我想按字符串规则对它们进行排序
示例: {1, 7, 43, 15, 2, 12} -> {1, 12, 15, 2, 43, 7}
我环顾四周,发现Integer.toString(int)
和String.valueOf(int)
,但这需要创建一个新的String数组并单独转换它们并对其进行排序并将其转换回Integer并重新分配。另外,我认为的比较器不会有太大的不同。
那么有更多方法可以做到这一点吗?
答案 0 :(得分:4)
两个直接的选择是:
List<String>
创建List<Integer>
,然后对该字符串列表进行排序,最后将其重新转换为整数列表。 主要差异:当您最初创建字符串列表时,您必须进行转换整数 - &gt;字符串...每个输入数字一次。
当你在比较器中这样做时,你可能会经常这样做!因为你将使用Comparator<Integer, Integer>
...总是需要将两个参数都转换为字符串。或者使用相对昂贵的数学来确定输入数字的“长度”。
除此之外:除非我们讨论的是能够处理数百万个数字的代码;或者每分钟被称为数千次......担心性能是完全错误的。担心代码的可读性;以及将来维护它所需的努力。
最后:如果你认为这是一个挑战,如何使用“有趣”的方式来解决这个问题;另一个解决方案:你可以使用一些Pair<String, Integer>
类;使用从整数编号生成的字符串。现在将它们放入List中,并使用比较器对Pair的String部分进行排序。然后你不需要另一个转换;你只需走两对,就可以从每对中获取整数。但同样,这就是微观绩效管理,只是为了“有趣”。
答案 1 :(得分:3)
以下是使用自定义Comparator
的示例,该示例基于整数的String
表示形式:
Integer[] intArray = { 1, 7, 43, 15, 2, 12 };
Comparator<Integer> comparator = new Comparator<Integer>() {
@Override
public int compare(final Integer o1, final Integer o2) {
return String.valueOf(o1).compareTo(String.valueOf(o2));
}
};
Arrays.sort(intArray, comparator);
System.out.println(Arrays.toString(intArray));
答案 2 :(得分:2)
我还会继续这个
List<Integer> list = Arrays.asList(1, 7, 43, 15, 2, 12);
List<Integer> orderedList= list.stream()
.map(String::valueOf)
.sorted()
.map(Integer::parseInt)
.collect(Collectors.toList());
答案 3 :(得分:1)
只是另一种方式,这次使用java8的lambda功能
List<Integer> l = Arrays.asList(1, 7, 43, 15, 2, 12);
l.sort((x, y) -> x.toString().compareTo(y.toString()));
System.out.println(l);
输出:
[1,12,15,2,43,7]
答案 4 :(得分:0)
您可以使用自定义Comparator
。如果你也可以将它用于其他类型,你可以保持通用:
class StringComparator<T> implements Comparator<T> {
@Override
public int compare(T first, T second) {
// compare String representations
return first.toString().compareTo(second.toString());
}
}
然后,您可以排序:
Integer[] a = {1; 2; 3; 11; 22}
Arrays.sort(a, new StringComparator<Integer>());