Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
允许多个相等值的Java排序集合impl_Java_Collections - Fatal编程技术网

允许多个相等值的Java排序集合impl

允许多个相等值的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

我尝试使用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)->(双精度)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,对我来说很好。