Java中是否存在现有的List
实现,它基于提供的Comparator
来维护订单?维护订购的列表实现
的东西,可以通过以下方式使用:
Comparator<T> cmp = new MyComparator<T>();
List<T> l = new OrderedList<T>(cmp);
l.add(someT);
使someT
被插入,使得在列表中的顺序是根据cmp
保持(在@andersoj建议我完成我的问题与另一个请求)
此外,我希望能够遍历列表按排序顺序没有删除的元素,即:
T min = Const.SMALLEST_T;
for (T e: l) {
assertTrue(cmp.compare(min, e) >= 0);
min = e;
}
应该通过。
所有建议,欢迎(除了告诉我无序完整列表上使用Collections.sort
),但是,我宁愿东西java.*
或最终org.apache.*
因为它是很难在这个时刻推出新库。
注:(UPDATE4)我意识到,这种列表的实施将有不足的表现。有两种常用的方法:
- 使用联结构(在某种程度上)B树或类似
- 使用阵列和插入(二进制搜索)
否1.有CPU高速缓存未命中问题 否2.移位阵列中的元素存在问题。
UPDATE2: TreeSet
不起作用,因为它使用所提供的比较器(MyComparator
)来检查平等和基于它假定元素都是平等的,排除它们。我需要一个比较只限于购买,而不是“唯一性”过滤(因为通过其自然顺序的元素是不相等的)
UPDATE3: PriorityQueue
不作为List
工作(我需要),因为没有办法按照它“排序”的顺序遍历它,为了获得排序顺序的元素,你必须将它们从集合中删除。
UPDATE:
类似的问题:
A good Sorted List for Java
Sorted array list in Java
这种行为会违反'List'合同,通常是一个坏主意。 (番石榴已考虑并拒绝这些功能。) –
“List”合同的哪个部分会被违反? –
'add(E)'的规范说:“将指定的元素追加到此列表的末尾。”将它添加到列表中的任何其他位置都违反了合同。 –