Java 从HashSet中删除元素
我想从哈希集中删除一个元素。 有人能帮我理解,为什么猫“emma”不能从这个哈希集中删除? 最好的解决方案是什么 谢谢大家!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"));
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();
}