允许多个相等值的Java排序集合impl
我尝试使用TreeSet:允许多个相等值的Java排序集合impl,java,collections,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)); 比较器pc=(p1,p2)->(双精度)p
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));
比较器pc=(p1,p2)->(双精度)p1.getPrice()).compareTo(p2.getPrice());
集合产品=新树集合(pc);
增加(新产品(10));
增加(新产品(10));
但问题是,就比较器而言,它不能包含多个相等的值,因此只有一个乘积在products
集合中
我需要一些集合实现,它将对新插入的值进行排序,允许许多相等的(在比较器方面)值,并具有插入复杂性log(n)(可能是基于树的impl)在JDK中,一个符合您确切需求的
类是。从文件中:
基于优先级堆的无限优先级队列。优先级队列的元素根据其自然顺序排序,或由队列构造时提供的比较器
排序,具体取决于使用的构造函数
及
实施说明:此实施为排队和退队方法(offer
、poll
、remove()
和add
)提供了O(log(n))
时间;删除(对象)
和包含(对象)
方法的线性时间;检索方法的固定时间(peek
、元素
、和大小
)
您还可以继续使用树集
,但提供一个比较器
,该比较器给出唯一的答案。例如,如果您的产品
具有唯一的名称
:
Comparator<Product> pc = Comparator.comparing(Product::getPrice)
.thenComparing(Comparator.comparing(Product::getName));
Comparator pc=Comparator.comparating(产品::getPrice)
.thenComparing(Comparator.comparing(Product::getName));
请注意比较器的使用。比较
而不是lambda-它更整洁、更健壮。JDK中符合您确切要求的类。从文件中:
基于优先级堆的无限优先级队列。优先级队列的元素根据其自然顺序排序,或由队列构造时提供的比较器
排序,具体取决于使用的构造函数
及
实施说明:此实施为排队和退队方法(offer
、poll
、remove()
和add
)提供了O(log(n))
时间;删除(对象)
和包含(对象)
方法的线性时间;检索方法的固定时间(peek
、元素
、和大小
)
您还可以继续使用
树集
,但提供一个比较器
,该比较器给出唯一的答案。例如,如果您的产品
具有唯一的名称
:
Comparator<Product> pc = Comparator.comparing(Product::getPrice)
.thenComparing(Comparator.comparing(Product::getName));
Comparator pc=Comparator.comparating(产品::getPrice)
.thenComparing(Comparator.comparing(Product::getName));
请注意比较器的使用。比较而不是你的lambda-它更整洁、更健壮。如果你真的需要在插入时订购元素,你可以使用番石榴。如果你真的需要在插入时订购元素,你可以使用番石榴。因此,
为我工作 没有。当我添加两个不同的对象时:
products.add(新产品(10));
增加(新产品(10))代码>
第一个实例包含两个链接,第二个实例没有链接()
为我工作
没有。当我添加两个不同的对象时:
products.add(新产品(10));
增加(新产品(10))代码>
它包含两个链接,第一个链接,第二个链接没有()您的产品是否有一些独特的东西,比如productId?可能是Assylid的副本:不,我不需要ID。看起来Guava TreeMultiset对我来说很好,但我想知道我是否可以使用Java Collection API来实现。当你说“基于树”时,你真的是指排序?在内部实现一个集合对你来说并不重要。你可能会在中发现一些有趣的东西。你的产品是否有一些独特的东西,比如productId?Assylid的可能副本:不,我不需要ID。看起来Guava TreeMultiset对我来说很好,但我想知道我是否可以使用Java collection API来实现它。当你说“基于树”,你真的是指排序?内部集合的实现对你来说并不重要。你可能会在中发现一些有趣的东西。谢谢,我刚刚尝试了JDK Priorityoue,对我来说很好。谢谢,我刚刚尝试了JDK Priorityoue,对我来说很好。