我正在寻找一个Set类,它将使用给定的比较器来删除所有()。
我正在使用TreeSet但是几个小时后我的头发一直试图弄清楚为什么我的removeAll()没有移除任何我发现这个......
http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4730113
长话短说明removeAll()使用equals()方法。 (但奇怪的是remove()方法不会......)
我确实需要一个Set,其中重复删除,最好是使用比较器但不是必需的,我不能覆盖equals方法b / c我需要它,因为其他逻辑。显然我想避免在所有元素上创建一个调用remove()的循环,这样就不会在将来(或其他人)混淆我。
这种动物是否存在?
答案 0 :(得分:0)
TreeSet.removeAll
方法接受Collection<?>
作为参数。集合中的对象可以是任何类型,不一定是Comparable对象。您需要使用不同的方法创建自己的Set。请注意,错误解决方案是“无法修复”
答案 1 :(得分:0)
这种行为实际上非常合理。 'equals'确定两个对象是否具有相同的标识,compare确定了某种形式的大小与它们之间的关系。
两个对象可以绝对不同(等于返回false)但仍然具有相同的大小(例如,考虑复数)。
您的期望是removeAll将根据对象的“大小”(由比较定义)确定需要删除的内容,您看到的删除实际上是根据身份进行的。
简而言之,使用循环: - )
答案 2 :(得分:0)
您可以使用
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);
}
答案 3 :(得分:0)
您是否覆盖了TreeSet包含的对象的equals和hashcode方法?