我们是否像在SortedSet或TreeMap中一样在java中排序列表?我有一个类,其中一个属性为对象列表。在添加或通过setter(set(List list))设置时,必须随时对此列表进行排序。
我们是否有像TreeMap这样的组件列表?任何建议或帮助都会非常明显。提前谢谢。
答案 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