Java indexof()搜索

时间:2013-04-21 15:41:01

标签: java search linked-list

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

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

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

class myClass(){
    public int id;
}

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

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

这是我可以用prebuild libary做的事情,还是我将不得不为自定义对象扩展自己的搜索功能?

5 个答案:

答案 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;
        }
    });