【问题标题】:Fastest way to get a sorted array out of an Iterable of integers [duplicate]从整数的Iterable中获取排序数组的最快方法[重复]
【发布时间】:2012-11-02 13:04:08
【问题描述】:

可能重复:
Fastest strategy to form and sort an array of positive integers

从未排序的整数迭代中获取排序数组的最快方法是什么?目前我通过迭代可迭代的 n 次(其中 n 是列表的大小)每次从可迭代中获得最高值并将其放入数组中来做到这一点。但我正在寻找清理它并让一些好的图书馆为我做这件事。

可能我不介意为此目的使用任何流行的库,如 Guava 等。

【问题讨论】:

  • 填充然后排序会不够快吗?相关:*.com/questions/12063849/…
  • 使用 JDK8 stream(iterable).sorted(comparator).toArray().
  • 我知道这并不完全是一个答案,但每个人都应该看看:sorting-algorithms.com
  • Ordering.natural().sortedCopy(integers) 做得很好。
  • 我不认为标记为重复的问题本质上是相同的。 @LouisWasserman 我相信您应该将其作为答案发布,这应该被接受(很抱歉在 5 年后发布)。我用它来对火花对 rdd 的值进行排序。

标签: java


【解决方案1】:

这与 assylias 已经提供的答案基本相同,但如果您在类路径中有 Google Guava,您可以将其缩短为:

import java.util.Collections;
import java.util.List;

import com.google.common.collect.Lists;

...

List list = Lists.newArrayList(iterable);
Collections.sort(list);

【讨论】:

    【解决方案2】:

    正如所评论的,最简单且可能最快的方法是填充集合并对其进行排序 - 在这种情况下,我会简单地使用 ArrayList:

    List<Integer> sortedList = new ArrayList<>();
    for (Integer i : yourIterable) {
        sortedList.add(i);
    }
    Collections.sort(sortedList);
    

    如果您事先知道您的 Iterable 的大小,您可以使用正确的大小初始化数组列表以提高效率:

    List<Integer> sortedList = new ArrayList<>(size);
    

    【讨论】:

    • 感谢您提供答案。如果我知道大小,我不应该只使用 int[] 而不是使用列表吗?
    • @user01 不确定哪个会更快。对int[] 的数组进行排序可能比对List&lt;Integer&gt; 的排序稍快一些,但是创建数组需要对所有整数进行拆箱,而创建列表只需复制引用即可。您应该测试这两种方法并做出决定。如果你这样做,请确保你阅读how to write a micro benchmark