Java:Collection.sort()vs Sorted Set vs PriorityQueue

Java:Collection.sort()vs Sorted Set vs PriorityQueue,java,performance,sorting,Java,Performance,Sorting,我有以下结构:MyObject的列表, 和比较2个肌肉对象的比较器 任务是从列表中获取最多N个较小的对象 该问题可通过以下几种方式解决: 将所有元素放在一个新列表中,并使用 Collections.sort()或Arrays.parallelSort()或 将所有元素放入ProirityQueue,然后检索N个最上面的元素 将所有元素放入SortedSet(TreeSet)并检索所需元素 使用迭代器 我不知道该怎么选择。克里特里亚是一场表演。 “内部列表”的大小约为20个元素,“外部”列表的大小

我有以下结构:MyObject的列表, 和比较2个肌肉对象的比较器

任务是从列表中获取最多N个较小的对象

该问题可通过以下几种方式解决:

  • 将所有元素放在一个新列表中,并使用 Collections.sort()或Arrays.parallelSort()或

  • 将所有元素放入ProirityQueue,然后检索N个最上面的元素

  • 将所有元素放入SortedSet(TreeSet)并检索所需元素 使用迭代器

  • 我不知道该怎么选择。克里特里亚是一场表演。
    “内部列表”的大小约为20个元素,“外部”列表的大小约为10

    如果您只需要大约200个元素中最低的N个元素,而N很小(比如10-20),那么为什么还要麻烦将所有元素添加到另一个结构中(无论是列表还是优先级队列)?只需创建一个包含N个项目的数组(或列表,如果必须的话)。检查列表列表中的每个元素,并将该元素插入到N数组中的正确列中。丢弃从列表底部掉落的第N个元素。这类似于插入排序算法,但只执行部分排序


    如果N很大(比如200个项目中的150个),那么完整排序或优先级队列可能更好。你需要进行测量。

    那么,除了写这个问题,你还做了什么吗?您是否查看了每个可能解决方案的数据结构上的任何操作的时间复杂性?N个较小的对象是什么意思?您需要N个比一个特定对象更小的对象,还是需要整个结构中的N个最小对象?对于大小列表
    20
    10
    ,从性能角度看,这是不相关的,但如果元素不唯一,您不能使用
    SortedSet
    “标准是绩效“,更改列表的频率与访问缩减列表的频率很重要。您是否能够绕过分析选项是值得怀疑的。如果您只需要部分排序,那么这只是
    N
    元素。那么最好的可能是
    优先级队列
    ,它正是为此目的而构建的。将所有内容放入其中,然后调用
    N
    乘以
    pullMin
    方法(或调用方式)。如果您仔细观察事情是如何在内部实现的,您将立即看到为什么
    PriorityQueue
    是此任务的一个好选择。但是,正如其他人所说,对于只包含20个元素的列表,情况可能会有所不同。对于更大的列表,如
    1mio
    ,您将注意到一个巨大的性能差异。谢谢!我将立即实现并测试它。我测试了您提出的解决方案,结果非常好。比较操作的数量显著减少(我在日志中看到这一点)。结果是:使用并行排序(10000次迭代约18毫秒),使用优先级队列(约60毫秒),使用“部分排序”(10000次迭代约7毫秒)。谢谢