Java 从HashSet中删除元素

Java 从HashSet中删除元素,java,iterator,hashset,remove,Java,Iterator,Hashset,Remove,我想从哈希集中删除一个元素。 有人能帮我理解,为什么猫“emma”不能从这个哈希集中删除? 最好的解决方案是什么 谢谢大家! public static void main(String[] args) { HashSet<Cat> set = new HashSet<Cat>(); set.add(new Cat("cindy")); set.add(new Cat("emma"));

我想从哈希集中删除一个元素。 有人能帮我理解,为什么猫“emma”不能从这个哈希集中删除? 最好的解决方案是什么

谢谢大家!

public static void main(String[] args) {

    HashSet<Cat> set = new HashSet<Cat>();
    
    set.add(new Cat("cindy"));
    set.add(new Cat("emma"));
    
    Iterator<Cat> iterator = set.iterator();

    while (iterator.hasNext()) {
        Cat name1 = iterator.next();

        if (name1.equals("emma")) {
            iterator.remove();
        }
    }
    System.out.println(set);
}

public static class Cat {
    private String name;

    public Cat(String name) {
        this.name = name;
    }

    public String toString() {
        return this.name;
    }
}
publicstaticvoidmain(字符串[]args){
HashSet=newhashset();
集合。添加(新类别(“cindy”);
集合。添加(新类别(“emma”);
迭代器迭代器=set.Iterator();
while(iterator.hasNext()){
Cat name1=迭代器.next();
如果(名称1.equals(“emma”)){
iterator.remove();
}
}
系统输出打印项次(套);
}
公共静态类Cat{
私有字符串名称;
公共Cat(字符串名称){
this.name=名称;
}
公共字符串toString(){
返回此.name;
}
}

您可以看到运行以下代码时出现的问题:

Cat c = new Cat("emma");
if(c.equals("emma"))
    System.out.println("true"); // this is what you expect
else
    System.out.println("false!"); // this is what actually happens!
这是因为如果未定义
equals
方法,则默认情况下会比较两个对象是否完全相同。您可以找到有关此行为的更多信息以及。在本例中,您将比较
字符串
对象和
Cat
对象

一种可能的解决方案是使用类中定义的
toString
方法来比较字符串。
equals
方法在
String
类中被重写,以获得您期望的行为

public static void main(String[] args) {

    HashSet<Cat> set = new HashSet<Cat>();
    
    set.add(new Cat("cindy"));
    set.add(new Cat("emma"));
    
    Iterator<Cat> iterator = set.iterator();

    while (iterator.hasNext()) {
        Cat name1 = iterator.next();

        if (name1.toString().equals("emma")) {
            iterator.remove();
        }
    }
    System.out.println(set);
}

您正在使用Cat的
equals
方法,并将字符串作为参数,该方法返回false。您可以在重写它时使用
toString
方法,或者使用
getter
作为名称并将其与字符串进行比较

boolean equals(Object anObject)
请注意,
equals
方法接受
对象
,因此当两个变量不是您期望的
字符串
时,不会出现异常(顺便说一句,IntelliJ IDEA会检查这种情况)。您只需将
字符串“emma”
name1.name进行比较即可解决此问题:

while (it.hasNext()) {
    Cat name1 = it.next();

    if ("emma".equals(name1.toString()))
        it.remove();
}

一个
Cat
永远不等于一个
String
,除非你已经定义了一个真正坏掉的equals方法。也许您需要类似于
Cat=iterator.next()的东西;if(cat.toString().equals(“emma”){…}
set.removeIf(cat->cat.toString().equals(“ema”))谢谢两位:)乔恩:我还没有定义任何equals方法,只是我发布的;)
while (it.hasNext()) {
    Cat name1 = it.next();

    if ("emma".equals(name1.toString()))
        it.remove();
}