[英]Alternative to using TreeSet in java?
我正在寻找一个将使用给定比较器删除All()的Set类。
我正在使用TreeSet,但几个小时后我的头发试图弄清楚为什么我的removeAll()没有删除任何我发现这...
http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4730113
长话短说removeAll()使用equals()方法。 (但奇怪的是remove()方法不...)
我确实需要一个Set,其中重复删除,最好是使用比较器,但不是必需的,我不能覆盖equals方法b / c我需要它作为其他逻辑。 显然我想避免在所有元素上创建一个调用remove()的循环,这样它就不会在将来(或其他人)混淆我。
这样的动物动物存在吗?
TreeSet.removeAll
方法接受Collection<?>
作为参数。 集合中的对象可以是任何类型,不一定是Comparable对象。 您需要使用不同的方法创建自己的Set。 请注意,错误解决方案是“无法修复”
这种行为实际上非常合理。 'equals'确定两个对象是否具有相同的标识,compare比较确定了与它们对应的某种形式的大小之间的关系。
两个对象可以绝对不同(等于返回false)但仍然具有相同的大小(例如,考虑复数)。
您的期望是removeAll将根据对象的“大小”(由比较定义)确定需要删除的内容,您看到的删除实际上是根据身份进行的。
简而言之,使用循环:-)
你可以用
public static <T> void removeAll(TreeSet<T> set, Collection<T> toRemove)
{
TreeSet<T> toRemoveTreeSet=new TreeSet<>(set.comparator());
toRemoveTreeSet.addAll(toRemove);
set.removeAll(toRemoveTreeSet);
}
要么
public static <T> void removeAll(TreeSet<T> set, Collection<?> toRemove)
{
for(Object o:toRemove) set.remove(o);
}
您是否重写了TreeSet包含的对象的equals和hashcode方法?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.