【问题标题】:Removing an object from TreeSet从 TreeSet 中移除一个对象
【发布时间】:2017-03-06 17:39:37
【问题描述】:

所以我有以下相关代码:

public static TreeSet<Object> set;



public static void remove(Object object){
    for (Object o : set){
        if (o.equals(object)){
            System.out.println("removing " + o);
            set.remove(o);
        }
    }
}

我向那个 TreeSet 添加了一些对象,然后我以某个 object1 作为参数调用 remove。 object1 在集合中,如

removingobject1

打印出来。

然而,当我随后使用这样的 for 循环打印出整个集合时:

for (Object o: set){
        System.out.println(o);
    }

它仍然会打印出包括 object1 在内的整个集合。它显然在之前的集合中,Java 能够识别它,但调用 set.remove(o) 完全没有结果。

编辑:我试图让问题尽可能笼统,但这里是我正在使用的对象:

public class Player implements Comparable<Player>{

public String firstname;
public String lastname;
public int value;
public Position position;



public Player(String firstname, String lastname, int value, Position position){
this.firstname = firstname;
this.lastname = lastname;
this.value = value;
this.position = position;

}

public String toString(){
    return(firstname + " " + lastname")
}


public int compareTo(Player player){
    if (this.value > player.value){
        return -1;
    } else {
        return 1;
    }
}

【问题讨论】:

  • 你的对象是否实现hashCode()?请发帖minimal reproducible example
  • 请显示一些代码来显示您的集合和对象的操作。你如何创建你的对象,它们如何实现 hashCode(),你如何将它们添加到集合中?
  • 您正在使用对象类您是否还设置了任何属性?如果您将代码粘贴到此处,我们会更容易为您提供帮助。
  • TreeSet 需要实现Comparable 接口的对象或Comparator 来比较元素。你用哪个?
  • 当 this.value == player.value 在你的 compareTo(...) 方法中返回 0 并且它会起作用。

标签: java collections treeset


【解决方案1】:

您的删除方法可能如下所示:

public static void remove(Object object){
   set.remove(o);
}

方法 remove 如果元素存在于集合中,则删除它,如果元素被删除,则返回 true。您不应该在迭代期间修改您的集合 (docs):

这个类的迭代器方法返回的迭代器是快速失败的: 如果集合在迭代器创建后的任何时间被修改,在 任何方式,除了通过迭代器自己的 remove 方法,迭代器 将抛出 ConcurrentModificationException。于是,面对 并发修改,迭代器快速而干净地失败, 而不是冒着随意的、非确定性的行为的风险 未来未定时间。

【讨论】:

  • 这是真的,但没有回答问题。我怀疑迭代只是为了证明元素在集合中。
  • 在这种情况下,它应该抛出 ConcurrentModificationException,因为一个元素被删除并且 modCount 值被改变,所以迭代器应该失败。
  • 我实际上已经尝试过这种方式,但不知何故它不起作用。我实现了 for 循环以查看 Java 是否识别出该对象仍在集合中(它是)。如果 remove(o) 实际上自然地工作,我会删除不必要的 for 循环。 ;)
猜你喜欢
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-11
  • 2017-06-10
  • 2011-10-22
  • 1970-01-01
相关资源
最近更新 更多