Java:从Vector中删除自定义对象

时间:2009-02-26 00:04:19

标签: java collections vector

我有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()没有。有什么想法吗?

4 个答案:

答案 0 :(得分:2)

您有两种选择:

  • 为MyClass实施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;
}

这假设myClassint个成员ab