0

我有2节课。

public class klass1 {

String bir;
String myID;

klass1(String bir, String myID)
{
    this.bir=bir;
    this.myID=myID;
}

}

.

import java.util.*;

public class dd {

public static void main(String[] args) {

    ArrayList<Object> ar=new ArrayList();

    ar.add(new klass1("wer","32"));
    ar.add(new klass1("das","23"));
    ar.add(new klass1("vz","45"));
    ar.add(new klass1("yte","12"));
    ar.add(new klass1("rwwer","43"));

    ar.remove(new klass1("vz","45"));//it's not worked!!!

    System.out.println(ar.size());

}

}

我想要的是从具有对象的第二个属性的数组列表中删除或获取一个对象。我怎样才能做到这一点?有没有简单的方法?

4

3 回答 3

2

只需实现equals类 Klass1 中的方法。

public class Klass1 {

    String bir;
    String myID;

    Klass1(String bir, String myID)
    {
        this.bir=bir;
        this.myID=myID;
    }

    public boolean equals(Object o){
        if(o instanceof Klass1)
            return ((Klass1)o).myID.equals(myID);
        else
            return false;
    }

}

于 2013-11-11T14:27:57.767 回答
0

这是因为您试图删除一个不在数组列表中的新对象。当您使用时,new klass1("vz","45")您正在创建一个不在数组列表中的此类的新实例。

于 2013-11-11T14:28:15.680 回答
0

系统内部所做的是使用 equals 比较这些类。以下代码解释了为什么这不起作用:

Object o1 = new Object();
Object o2 = new Object();
System.out.println(o1 == o2); // false, obviously
System.out.println(o1.equals(o2)); // false
System.out.println(o1); // java.lang.Object@17046822
System.out.println(o2); // java.lang.Object@22509bfc

您可以通过 @ 后面的数字来判断这些对象具有不同的哈希值,这就是 Object 的 equals 函数所做的检查。

这与您的 klass 相关,因为除非您覆盖 equals,否则您将使用 Object 的 equals。如果你实现了equals,你也应该总是实现hashcode。因为两者都告诉你两个对象是否“相同”,如果一个对象说的不是另一个对象,你的代码的某些部分可能会混淆。

如何为您的班级正确实施equals:

@Override
public int hashCode() {
  int hash = 7;
  hash = 17 * hash + Objects.hashCode(this.bir);
  hash = 17 * hash + Objects.hashCode(this.myID);
  return hash;
}

@Override
public boolean equals(Object obj) {
  if (obj == null) {
    return false;
  }
  if (getClass() != obj.getClass()) {
    return false;
  }
  final klass1 other = (klass1) obj;
  if (!Objects.equals(this.bir, other.bir)) {
    return false;
  }
  if (!Objects.equals(this.myID, other.myID)) {
    return false;
  }
  return true;
}

顺便说一句,这可以在大多数 IDE 中使用快捷方式(Netbeans 中的 iE alt-insert)来完成。请注意,我在 Java 7 中使用 Objects 进行了此操作。如果您在 Java 6 中,则需要手动键入
(a == b) || (a != null && a.equals(b));与相应的对象进行比较。

创建正确的哈希码并不总是微不足道的,对于更复杂的对象,您可能需要先阅读一些有关哈希码的信息。对于简单的对象:将素数与某物相乘。

equals 方法通常很简单,首先检查 null 和类是否相等很重要。这经常被程序员忘记,并且是 NullPointerExceptions 和 ClassCastExceptions 的常见来源。

于 2013-11-11T14:38:45.560 回答