像TreeMap或SortedSet这样的java中的排序列表

时间:2012-11-05 16:27:09

标签: java collections

我们是否像在SortedSet或TreeMap中一样在java中排序列表?我有一个类,其中一个属性为对象列表。在添加或通过setter(set(List list))设置时,必须随时对此列表进行排序。

我们是否有像TreeMap这样的组件列表?任何建议或帮助都会非常明显。提前谢谢。

5 个答案:

答案 0 :(得分:8)

拥有一个列表的目的是它们应该保持添加它们的元素的顺序。所以,我不认为你想要的是什么。

您可以随时使用Collections.sort()方法对列表进行排序。

答案 1 :(得分:2)

您想要的是一个有序的 Bag/MultiSet 实施,例如Google Guava TreeMultiSet

Guava中的 TreeMultiSet 定义为:

  

一个多重集,它维持其元素的排序,根据   无论是他们的自然顺序还是明确的比较者。

MultiSet 的位置:

  

支持与顺序无关的相等的集合,例如Set,但是   可能有重复的元素。 multiset有时也被称为a   的

有关MultiSet的更多信息,您可以在Google Guava: MultiSets上阅读此dzone文章(除非您确实需要 TreeMultiSet ),此番石榴页面维基explaining their new collection types

答案 2 :(得分:0)

您可以为Collection使用其他一些数据类型,因为您不关心元素的顺序(这是List的基本属性)。例如,如果您没有重复项,我认为SortedSet可以解决问题。

否则,您可以在Collections.sort()上使用List

答案 3 :(得分:0)

Java SDK没有排序的List类。每次添加内容时,最简单的解决方案是在Collections.sort()上致电List

答案 4 :(得分:0)

您可以扩展现有ArrayList以创建SortedList。因为您只需要在插入时处理订单。

public class SortedList<E extends Comparable<E>> extends ArrayList<E> {

    @Override
    public boolean add(E e) {
        int index = Collections.binarySearch(this, e);
        super.add(index < 0 ? ~index : index, e);
        return true;
    };
}

Java Doc Collections.binarySearch

  

返回:搜索键的索引(如果它包含在列表中);否则,(-(insertion point) - 1)。插入点定义为键将插入列表的点:第一个元素的索引大于键,或者list.size(),如果列表中的所有元素都小于指定的键。请注意,当且仅当找到密钥时,这可以保证返回值为>= 0

<强>更新 正如@Louis Wasserman指出的那样,基本列表契约会产生基于索引的插入元素的问题。如果您想支持该功能,则应使用Collections.sort()。您还可以使用具有低于该类

的相对性能统计信息的org.apache.commons.collections.list.TreeList
              get  add  insert  iterate  remove
TreeList       3    5       1       2       1
ArrayList      1    1      40       1      40
LinkedList  5800    1     350       2     325