繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM