Java indexof()搜索
我有一个javaJava indexof()搜索,java,search,linked-list,Java,Search,Linked List,我有一个javaLinkedList,其中包含几个相同类型的自定义对象 LinkedList<myClass> = new LinkedList<myClass>(); 我希望能够返回特定值匹配的链表索引,即:查找对象id=7的LinkedList索引 我研究过如何使用索引of,包含,以及包含所有,但没有任何运气(索引总是返回-1) 这是我可以用预构建库做的事情,还是我必须扩展我自己的自定义对象搜索功能?覆盖myClass类上的equals方法,以便LinkedList
LinkedList
,其中包含几个相同类型的自定义对象
LinkedList<myClass> = new LinkedList<myClass>();
我希望能够返回特定值匹配的链表索引,即:查找对象id=7的LinkedList索引
我研究过如何使用索引of
,包含,以及包含所有,但没有任何运气(索引总是返回-1)
这是我可以用预构建库做的事情,还是我必须扩展我自己的自定义对象搜索功能?覆盖myClass
类上的equals
方法,以便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
,因此还应重写该方法:
原因在对象类javadoc中解释:
请注意,每当重写hashCode方法时,通常都需要重写该方法,以便维护hashCode方法的一般约定,即相等的对象必须具有相等的哈希代码
这可以通过List
的indexOf()
方法来实现,您所要做的就是在myClass
中重写equals()
和hashChode()
,以指定必须使用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));
list.get(newId);
也就是说,假设在myClass
中存在一个构造函数,该构造函数将id
作为参数 也许你应该把你的物品简单地存储在
您使用键将对象作为值放入其中。如果你想搜索一个对象,你只需要通过键就可以了。例如,如果objectID是唯一的,则使用类并将其作为键
HashMap<Integer, myClass> list = new HashMap<Integer, myClass>();
list.put(newId, new MyClass(newId)); //just an example!
如果newId
不存在,则返回null
LinkedList使用其equals()方法比较对象。因此,如果希望类的两个实例具有相同ID时被视为相等,则必须重写equals()方法:
重写equals()时,还必须重写hashCode(),因为两个equals对象必须具有相同的hashCode:
@Override
public int hashCode() {
return id;
}
请注意,如果您不希望两个实例具有相同ID时被视为相等,那么您别无选择,只能迭代列表并查找第一个与您要查找的实例具有相同ID的元素。或者您必须使用另一种数据结构,例如地图。您可以这样做
list.indexOf(new Object() {
@Override
public boolean equals(Object o) {
MyClass mine = (MyClass) o;
return mine.id == yourValue;
}
});
您需要自己的搜索功能在现实世界中,链表从不与索引号关联。因此,如果你需要找到索引,你必须遍历整个列表。否则,链表和具有索引的数组之间有什么区别。链表是动态的。所以你要么动态跟踪索引,要么使用我在开头提到的方法。谢谢你的回复。我建立了自己的搜索功能,比我预期的要快得多!对于大数据集,我会考虑接受的答案。干杯谢谢你的回复。我建立了自己的搜索功能,比我预期的要快得多!对于大数据集,我会考虑接受的答案。干杯
@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;
}
@Override
public int hashCode() {
return id;
}
list.indexOf(new Object() {
@Override
public boolean equals(Object o) {
MyClass mine = (MyClass) o;
return mine.id == yourValue;
}
});