Java 为什么要设置树集';s remove()方法不使用';不适用于整数?
这段代码产生这个输出-->[5,4,3], 为什么4还在片场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)。无论如何,在您的情况下,您甚至不需要显式使用自定义比较器,您
公共类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,以便它也包含重复项。但集合从不包含重复项。如果需要处理重复,请考虑<代码>列表>代码>。