我有MyClass
,它存储了两个整数,我有一个名为Vector<MyClass>
的{{1}}。
现在,我这样做:
myVector
这里的问题是没有删除对象,正如我在打印Vector及其大小时看到的那样。我怎么能解决这个问题?
编辑:我可以看到它找不到对象,我已经使用...
myVector.add(new MyClass(1,1));
for(MyClass m : myVector)
System.out.println(m);
System.out.println(myVector.size());
myVector.remove(new MyClass(1,1));
for(MyClass m : myVector)
System.out.println(m);
System.out.println(myVector.size());
...
进行了测试以确定。我需要的是按价值比较它。如果我可以重载contains()
运算符,我可以做到,但我不知道如何解决这个问题。
编辑2:好的,==
会按我的意愿行事。但是我不确定将什么放入hashCode方法。
编辑3:我可以使用contains()找到它,但删除不会删除它。
我可以用它来删除它:
equals()
与remove相同(新的MyClass(1,1),除了上面的代码有效,而remove()没有。有什么想法吗?
答案 0 :(得分:2)
您有两种选择:
equals()
或修改了您的代码以删除您添加的同一个实例:
MyClass myClass = new myClass(1,1);
myVector.add(myClass );
for(myClass m : myVector)
System.out.println(m);
System.out.println(myVector.size());
myVector.remove(myClass );
for(myClass m : myVector)
System.out.println(m);
System.out.println(myVector.size());
我看到其他人为equals()
提供了一个示例实现 - 但你必须决定你想要的是什么?很可能是。您可以选择以上两个选项中的哪一个适合此对象。
正如其他人所说,如果您实施equals()
,那么必须实施hashCode()
。 Eclipse有一个很好的右键单击选项来实现equals()
和hashCode()
。我见过代码问题,有人只实现了equals()
,所以尽管这似乎是一个理论问题,但实际上并非如此。
答案 1 :(得分:1)
您尝试删除其他myClass,即使它包含与第一个相同的值。
如果希望它们被认为是相等的,则需要覆盖myClass的equals方法以检查值是否相等。
答案 2 :(得分:0)
你需要为这两个对象实现.equals()
......好吧,相等。但请注意,.equals()
和.hashCode()
的合同基本上告诉您,只要实施.hashCode()
,就必须实施.equals()
。
Chapter 3 of Effective Java会告诉你更多信息。
答案 3 :(得分:0)
grammar31
's answer;修复它们时出现的错误很少:
@Override
public boolean equals(Object o) {
if ((o == null) || (o.getClass() != myClass.class)) {
return false;
}
myClass other = (myClass) o;
return (other.a == this.a) && (other.b == this.b);
}
@Override
public int hashCode() {
return a * 31 + b;
}
这假设myClass
有int
个成员a
和b
。