我有一个java LinkedList
,它包含几个相同类型的自定义对象。
LinkedList<myClass> = new LinkedList<myClass>();
在我的对象中,我有一个特定的值
class myClass(){
public int id;
}
我希望能够返回链表的索引以获得特定值的匹配,即:查找对象id = 7的LinkedList索引
我已经研究过使用indexof
,contains
和containsall
,但没有任何运气(索引始终返回-1)。
这是我可以用prebuild libary做的事情,还是我将不得不为自定义对象扩展自己的搜索功能?
答案 0 :(得分: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;
}
Object
类javadoc:
请注意,通常需要在重写此方法时覆盖hashCode方法,以便维护hashCode方法的常规协定,该方法声明相等的对象必须具有相同的哈希代码。
答案 1 :(得分:0)
这可以使用List
的{{1}}方法实现,您只需覆盖indexOf()
中的equals()
和hashChode()
来指定必须使用myClass
属性进行比较(here解释了为什么需要覆盖这两种方法)。只需将此方法添加到id
:
myClass
现在要找到@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));
中存在一个以myClass
为参数的构造函数。
答案 2 :(得分:0)
也许你只需简单地将对象存储在HashMap<key,value>
中
你用钥匙把物体作为价值放在里面。如果你想搜索一个对象,你只需要通过密钥。因此,例如,如果它是唯一的,那么您将使用您的类并使用objectID作为键。
HashMap<Integer, myClass> list = new HashMap<Integer, myClass>();
list.put(newId, new MyClass(newId)); //just an example!
现在找到它只需要这样一行:
list.get(newId);
如果newId
不存在return null
。
答案 3 :(得分: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的第一个元素之外别无选择。寻找。或者您必须使用其他数据结构,例如Map<Integer, MyClass>
。
答案 4 :(得分:0)
你可以这样做
list.indexOf(new Object() {
@Override
public boolean equals(Object o) {
MyClass mine = (MyClass) o;
return mine.id == yourValue;
}
});