Java 为什么要设置树集';s remove()方法不使用';不适用于整数?

Java 为什么要设置树集';s remove()方法不使用';不适用于整数?,java,treeset,Java,Treeset,这段代码产生这个输出-->[5,4,3], 为什么4还在片场 公共类Temp4{ 公共静态void main(字符串[]args){ 树集=新树集((I1,I2)->(I1I2)?-1:-1); set.add(新的整数(5)); set.add(新整数(3)); set.add(新的整数(4)); set.remove(新的整数(4)); 系统输出打印项次(套); } } 问题在于您的比较器,您没有处理对象相等的情况(您应该返回0)。无论如何,在您的情况下,您甚至不需要显式使用自定义比较器,您

这段代码产生这个输出-->[5,4,3], 为什么4还在片场

公共类Temp4{
公共静态void main(字符串[]args){
树集=新树集((I1,I2)->(I1I2)?-1:-1);
set.add(新的整数(5));
set.add(新整数(3));
set.add(新的整数(4));
set.remove(新的整数(4));
系统输出打印项次(套);
}
}

问题在于您的比较器,您没有处理对象相等的情况(您应该返回0)。无论如何,在您的情况下,您甚至不需要显式使用自定义比较器,您可以像这样创建集合,它将工作:

TreeSet<Integer> set= new TreeSet<Integer>(Collections.reverseOrder()) ;
TreeSet set=newtreeset(Collections.reverseOrder());

首先,您的
比较器
已损坏,对于相等的元素,它应返回
0

其次,
TreeSet
使用
compare
查找元素,这与常规的
集合
契约相矛盾

请注意,由集合维护的顺序(无论是否为显式 如果提供比较器,则必须与equals一致 正确实现Set接口。(见可比或比较) 对于一个与等于一致的精确定义。)这是如此 因为Set接口是根据equals操作定义的, 但是TreeSet实例使用其 比较法,所以两个元素被认为是相等的 用这种方法,从集合的观点来看,是相等的。这个 即使集合的顺序不一致,集合的行为也是定义良好的 平等;它只是没有遵守集合的总合同 接口


你的比较器错了。它应该返回0作为默认值。实际上,使用比较器找不到任何相等项。我建议添加一些解释来说明
TreeMap
TreeSet
之间的链接,因为问题是关于
TreeSet
。但我必须使用TreeSet,以便它也包含重复项。但集合从不包含重复项。如果需要处理重复,请考虑<代码>列表>代码>。