5

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

我们有没有像 TreeMap 这样的组件列表?任何建议或帮助都将非常重要。提前致谢。

4

5 回答 5

7

拥有一个列表的目的是它们应该保持添加它们的元素的顺序。所以,我相信没有这样List的实现,其中元素在添加时进行排序。

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

于 2012-11-05T16:29:52.737 回答
2

你想要的是一个排序的Bag/MultiSet实现,比如Google GuavaTreeMultiSet

Guava 中的ATreeMultiSet定义为:

根据自然顺序或显式比较器维护其元素顺序的多重集。

其中 aMultiSet是:

支持顺序无关相等的集合,如 Set,但可能有重复元素。多重集有时也称为

有关 MultiSets 的更多信息,您可以阅读Google Guava 上的这篇 dzone 文章:MultiSets(除非您确实想要TreeMultiSet),以及 Guava wiki 的此页面解释他们的新集合类型

于 2012-11-05T16:40:09.580 回答
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 文档Collections.binarySearch

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

更新: 正如@Louis Wasserman 所指出的,这会与基于索引的插入元素的基本列表合同产生问题。如果您想支持该功能,那么您应该使用Collections.sort(). 您还可以使用org.apache.commons.collections.list.TreeListwhich 对该类具有以下相对性能统计信息

              get  add  insert  iterate  remove
TreeList       3    5       1       2       1
ArrayList      1    1      40       1      40
LinkedList  5800    1     350       2     325
于 2012-11-05T16:49:36.003 回答
0

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

否则,您可以Collections.sort()List.

于 2012-11-05T16:32:56.030 回答
-1

Java SDK 没有排序List类。您需要的最简单的解决方案是每次添加内容时都调用Collections.sort()您。List

于 2012-11-05T16:35:01.160 回答