一个java集合数据结构,用于保存项目的排序

时间:2015-07-01 14:15:24

标签: java data-structures

我有一个使用ArrayList<T>的程序,而且T类型也实现了Comparable<T>。我需要对该列表进行排序。

现在,当我插入新项目时,我将其添加到ArrayList,然后调用Collections.sort(myArrayList)

每次插入新项目时都会使用Collections.sort进行排序严重影响运行时复杂度?

是否有更适合的数据结构我可以用来始终对列表进行排序?我知道一个名为PriorityQueue的结构,但我还需要能够通过索引获取列表的元素。

编辑: 在我的特定情况下,插入一个新项目的速度远远低于已经存在的项目,所以最终一个好的建议也可以是ArrayList,因为它获得了一个项目的时间复杂性。但如果你知道其他任何事情......

4 个答案:

答案 0 :(得分:3)

List是一个有序集合,这意味着您需要能够使用索引进行访问。如果集合在内部对元素进行混洗或排序,则插入顺序将不同于内部数据结构中元素的顺序。所以你不能再依赖基于索引的访问了。因此,Sun没有提供SortedList或TreeList类。这就是你使用Collections.sort(..)

的原因

Apache commons-collections确实提供了一个TreeList类,但它不是一个排序的List并且被调用,因为它使用树数据结构在内部存储元素。请在此处查看其文档 - http://commons.apache.org/proper/commons-collections/javadocs/api-3.2.1/org/apache/commons/collections/list/TreeList.html

答案 1 :(得分:3)

似乎Collection.Sort实际上就是这里的方式,因为当集合已经几乎排序时,在最坏的情况下排序将不会超过O(n)。

答案 2 :(得分:1)

不是在每次插入后使用Collections.sort(myArrayList),您可能想要做一些更智能的事情,因为您知道每次插入元素时您的集合已经被订购。

Collections.sort(myArrayList)需要0(nlogn)时间,您可以使用Collections.binarySearch在O(n)时间内在有序集合中执行有序插入。如果按升序排序集合Collections.binarySearch,则返回您要查找的元素的索引(如果存在)或(-(insertion point) - 1)。在插入元素之前,您可以使用Collections.binarySearch(O(logn)时间)查找它。完成您可以派生插入新元素的索引。然后,您可以在O(n)时间内使用addAt添加元素。整个插入复杂性受addAt的限制,因此您可以在O(n)时间内在ArrayList中执行有序插入。

答案 3 :(得分:-1)

单个数据结构无法同时提供排序和基于索引的检索。如果输入集限制为几百或几千,则可以并行保留两个数据结构。

例如,ArrayList用于基于索引的检索,TreeMap(或优先级队列)用于排序。