2017-03-06 69 views
1
对象

所以,我有以下相关代码:去除TreeSet的

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作为参数来移除。 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; 
    } 
} 
+1

对象是否实现了'hashCode()'?请发布[mcve]。 – shmosel

+1

请显示一些代码,显示您的设置和对象的操作。你如何创建你的对象,他们如何实现hashCode(),你如何将它们添加到集合? –

+0

您正在使用的对象类是你还设置任何属性?如果你在这里粘贴你的代码,如果我们更容易帮助你。 – Maverick

回答

1

你的删除方法可能看起来像:

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

方法如果元素中存在元素,则移除元素,如果元素已被移除,则返回true。

此类的iterator方法返回的迭代器是快速失败的:你不应该迭代(docs)期间修改组 如果设定在任何时间创建迭代器后修改, 任何除了通过迭代器自己的remove方法外,迭代器 将抛出ConcurrentModificationException异常。因此,面对 并发修改,迭代器快速且干净地失败,而不是在未来未确定的时间处冒任意的,不确定的行为的风险。

+0

这是真的,但没有回答这个问题。我怀疑迭代只是为了证明元素在集合中。 – shmosel

+1

在这种情况下,它应该抛出ConcurrentModificationException,因为删除了一个元素并更改了modCount值,所以迭代器应该失败。 –

+0

我实际上已经尝试过这种方式,不知何故它没有工作。我实现了for循环来查看Java是否认识到对象仍然在集合中(它是)。如果remove(o)实际上自然工作,我会删除不必要的for循环。 ;) –