2

我有一个LinkedList包含多个相同类型的自定义对象的 java。

LinkedList<myClass> = new LinkedList<myClass>();

在我的对象中,我有一个特定的价值

class myClass(){
    public int id;
}

我希望能够返回链接列表的索引以匹配特定值,即:查找对象 id = 7 的 LinkedList 索引

我已经研究过使用indexofcontainscontainsall,但没有任何运气(索引总是返回-1)。

这是我可以用预构建库做的事情,还是我必须为自定义对象扩展我自己的搜索功能?

4

5 回答 5

1

覆盖类equals上的方法,myClass以便LinkedList可以找到对象:

public class myClass {
    private int id; //it should be private, not public
    //other attributes...
    //getters and setters...

    @Override
    public void equals(Object o) {
        if (o == null) return false;
        if (o == this) return true;
        if (o instanceof myClass) {
            myClass x = (myClass)x;
            return x.getId() == this.id;
        }
        return false;
    }
}

由于您正在覆盖equals,您还应该覆盖该hashCode方法:

@Override
public int hashCode() {
    return this.id;
}

其原因在Objectjavadoc 类中进行了解释:

请注意,每当重写该方法时,通常都需要重写 hashCode 方法,以维护 hashCode 方法的一般约定,即相等的对象必须具有相等的哈希码。

于 2013-04-21T15:44:22.320 回答
0

这可以根据List's方法来实现,您所indexOf()要做的就是覆盖equals()并指定必须使用属性进行比较(这里解释了为什么需要覆盖这两种方法)。只需将此方法添加到:hashChode()myClassidmyClass

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    myClass other = (myClass) obj;
    if (id != other.id)
        return false;
    return true;
}

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + id;
    return result;
}

现在要查找元素的索引,id == 7请执行以下操作:

int idx = myList.indexOf(new myClass(7));

也就是说,假设存在一个myClassid为参数的构造函数。

于 2013-04-21T15:45:11.817 回答
0

也许你应该简单地将你的对象存储在一个你将一个对象作为带有键的值放入其中。如果您想搜索一个对象,您只需通过密钥获取它。因此,例如,您使用您的课程并使用 objectID 作为键(如果它是唯一的)。HashMap<key,value>

HashMap<Integer, myClass> list = new HashMap<Integer, myClass>();
list.put(newId, new MyClass(newId)); //just an example!

现在要找到它,您只需要这样一行:

list.get(newId);

如果newId不存在的话return null

于 2013-04-21T15:45:34.663 回答
0

LinkedList 使用它们的 equals() 方法比较 Object。因此,如果您希望类的两个实例在具有相同 ID 时被视为相等,则必须重写 equals() 方法:

@Override
public boolean equals(Object o) {
    if (o == this) {
        return true;
    }
    if (o == null) {
        return false;
    }
    if (o.getClass() == this.getClass()) {
        return this.id == ((MyClass) o).id;
    }
    return false;
}

当覆盖 equals() 时,hashCode() 也必须被覆盖,因为两个 equals 对象必须具有相同的 hashCode:

@Override
public int hashCode() {
    return id;
}

请注意,如果您不希望两个实例在具有相同 ID 时被视为相等,那么您别无选择,只能迭代列表并找到与您要查找的实例具有相同 ID 的第一个元素。或者您必须使用其他数据结构,例如 a Map<Integer, MyClass>

于 2013-04-21T15:45:50.737 回答
0

你可以这样做

    list.indexOf(new Object() {
        @Override
        public boolean equals(Object o) {
            MyClass mine = (MyClass) o;
            return mine.id == yourValue;
        }
    });
于 2014-05-20T11:37:58.293 回答