Java sorted collection impl允许许多相等的值

时间:2017-02-08 09:25:16

标签: java collections

我尝试使用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)

3 个答案:

答案 0 :(得分:4)

JDK中符合您确切要求的classPriorityQueue。来自文档:

  

基于优先级堆的无界优先级队列。优先级队列的元素根据其自然顺序排序,或者由队列构造时提供的Comparator排序,具体取决于使用的构造函数。

  

实施说明:此实施为排队和出列方法O(log(n))offerpollremove()提供add时间; remove(Object)contains(Object)方法的线性时间;和检索方法的常量时间(peekelementsize)。

您还可以继续使用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));
它包含两个第一个实例的链接,而没有第二个()

的链接