Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java indexof()搜索_Java_Search_Linked List - Fatal编程技术网

Java indexof()搜索

Java indexof()搜索,java,search,linked-list,Java,Search,Linked List,我有一个javaLinkedList,其中包含几个相同类型的自定义对象 LinkedList<myClass> = new LinkedList<myClass>(); 我希望能够返回特定值匹配的链表索引,即:查找对象id=7的LinkedList索引 我研究过如何使用索引of,包含,以及包含所有,但没有任何运气(索引总是返回-1) 这是我可以用预构建库做的事情,还是我必须扩展我自己的自定义对象搜索功能?覆盖myClass类上的equals方法,以便LinkedList

我有一个java
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;
        }
    });