在java中使用TreeSet的替代方法?

时间:2014-02-06 07:44:36

标签: java set comparator removeall

我正在寻找一个Set类,它将使用给定的比较器来删除所有()。

我正在使用TreeSet但是几个小时后我的头发一直试图弄清楚为什么我的removeAll()没有移除任何我发现这个......

http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4730113

长话短说明removeAll()使用equals()方法。 (但奇怪的是remove()方法不会......)

我确实需要一个Set,其中重复删除,最好是使用比较器但不是必需的,我不能覆盖equals方法b / c我需要它,因为其他逻辑。显然我想避免在所有元素上创建一个调用remove()的循环,这样就不会在将来(或其他人)混淆我。

这种动物是否存在?

4 个答案:

答案 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方法?