我尝试使用TreeSet:
Comparator<Product> pc = (p1, p2) -> ((Double) p1.getPrice()).compareTo(p2.getPrice());
Set<Product> products = new TreeSet<>(pc);
products.add(new Product(10));
products.add(new Product(10));
但问题是它在Comparator方面不能包含多个相等的值,因此只有一个产品将在products
集中。
我需要一些Collection实现,它将命令新插入的值,允许许多相等(就Comparator而言)值,并且插入复杂度 log(n)(可能是基于树的impl)
答案 0 :(得分:4)
JDK中符合您确切要求的class
为PriorityQueue
。来自文档:
基于优先级堆的无界优先级队列。优先级队列的元素根据其自然顺序排序,或者由队列构造时提供的
Comparator
排序,具体取决于使用的构造函数。
和
实施说明:此实施为排队和出列方法
O(log(n))
,offer
,poll
和remove()
提供add
时间;remove(Object)
和contains(Object)
方法的线性时间;和检索方法的常量时间(peek
,element
和size
)。
您还可以继续使用TreeSet
,但提供Comparator
,以提供唯一的答案。例如,如果您的Product
具有唯一的name
:
Comparator<Product> pc = Comparator.comparing(Product::getPrice)
.thenComparing(Comparator.comparing(Product::getName));
请注意使用Comparator.comparing
而不是lambda - 它更整洁,更强大。
答案 1 :(得分:2)
如果您确实需要在插入时订购元素,可以使用Guava的TreeMultiset。
答案 2 :(得分:0)
所以,
PriorityQueue为我工作。
TreeMultiset没有。当我添加两个不同的对象时:
products.add(new Product(10));
products.add(new Product(10));
它包含两个第一个实例的链接,而没有第二个()