我们在 java 中是否像 SortedSet 或 TreeMap 一样对列表进行了排序?我有一个类,其中一个属性是对象列表。在添加或通过设置器(set(List list))设置它时,必须随时对该列表进行排序。
我们有没有像 TreeMap 这样的组件列表?任何建议或帮助都将非常重要。提前致谢。
我们在 java 中是否像 SortedSet 或 TreeMap 一样对列表进行了排序?我有一个类,其中一个属性是对象列表。在添加或通过设置器(set(List list))设置它时,必须随时对该列表进行排序。
我们有没有像 TreeMap 这样的组件列表?任何建议或帮助都将非常重要。提前致谢。
拥有一个列表的目的是它们应该保持添加它们的元素的顺序。所以,我相信没有这样List
的实现,其中元素在添加时进行排序。
您可以随时使用Collections.sort()
方法对列表进行排序。
你想要的是一个排序的Bag/MultiSet实现,比如Google Guava的TreeMultiSet
?
Guava 中的ATreeMultiSet
定义为:
根据自然顺序或显式比较器维护其元素顺序的多重集。
其中 aMultiSet
是:
支持顺序无关相等的集合,如 Set,但可能有重复元素。多重集有时也称为 包。
有关 MultiSets 的更多信息,您可以阅读Google Guava 上的这篇 dzone 文章:MultiSets(除非您确实想要TreeMultiSet
),以及 Guava wiki 的此页面解释他们的新集合类型。
您可以扩展现有的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.TreeList
which 对该类具有以下相对性能统计信息
get add insert iterate remove
TreeList 3 5 1 2 1
ArrayList 1 1 40 1 40
LinkedList 5800 1 350 2 325
您可以使用其他数据类型,Collection
因为您不关心元素的顺序(这是 a 的基本属性List
)。例如,SortedSet
如果您没有重复项,我认为这可以解决问题。
否则,您可以Collections.sort()
在List
.
Java SDK 没有排序List
类。您需要的最简单的解决方案是每次添加内容时都调用Collections.sort()
您。List