0

我有MyClass,它存储两个整数,我有一个Vector<MyClass>被调用的myVector.

现在,我这样做:

...
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());
...

这里的问题是对象没有被删除,正如我在打印 Vector 及其大小时看到的那样。我怎么能解决这个问题?

编辑:我可以看到它没有找到对象,我已经测试过contains()可以确定。我需要的是按价值进行比较。如果我可以重载==操作员,我可以做到,但我不知道如何解决这个问题。

编辑2:好的,equals()会做我想做的。但我不确定在 hashCode 方法中放什么。

编辑 3:我可以使用 contains() 找到它,但删除不会删除它。

我可以用它来删除它:

int position = myVector.indexOf(new MyClass(1,1));
myVector.remove(position);

这与 remove(new MyClass(1,1) 相同,除了上面的代码有效而 remove() 无效。有什么想法吗?

4

4 回答 4

2

你有两个选择:

  • equals()为 MyClass实现,或
  • 删除您添加的相同对象实例

您的代码已修改以删除您添加的同一实例:

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()所以虽然这似乎是一个理论上的问题,但实际上并非如此。

于 2009-02-26T00:12:24.050 回答
1

您正在尝试删除不同的 myClass,即使它包含与第一个相同的值。

如果您希望它们被视为相等,则需要覆盖 myClass 的 equals 方法以检查值是否相等。

于 2009-02-26T00:08:43.323 回答
0

您需要实现.equals()这两个对象才能考虑......好吧,相等。但请记住,合同.equals()基本上.hashCode()告诉您,.hashCode()无论何时实施,您都必须实施.equals()

Effective Java 第 3 章会告诉你更多。

于 2009-02-26T00:11:16.767 回答
0

grammar31的回答几乎没有错误;在这里修复它们:

@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;
}

这假设myClassint成员ab

于 2009-02-26T00:18:10.417 回答