对整数列表进行排序,就好像它是Java中的String列表一样

时间:2017-05-17 14:32:53

标签: java list sorting

我有一个简单的整数数组,我想按字符串规则对它们进行排序

示例: {1, 7, 43, 15, 2, 12} -> {1, 12, 15, 2, 43, 7}

我环顾四周,发现Integer.toString(int)String.valueOf(int),但这需要创建一个新的String数组并单独转换它们并对其进行排序并将其转换回Integer并重新分配。另外,我认为的比较器不会有太大的不同。

那么有更多方法可以做到这一点吗?

5 个答案:

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