2013-04-21 55 views
2

我有一个java LinkedList它包含几个相同类型的自定义对象。Java indexof()搜索

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

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

class myClass(){ 
    public int id; 
} 

我希望能够返回链表的索引匹配一个特定的值,即:查找LinkedList的指数其中对象ID = 7

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

这是我可以做一个预构建库,或者我将不得不扩展自己的自定义对象的搜索功能?

+0

你需要自己的搜索功能 – 2013-04-21 15:44:06

+0

在真实的场景链表,从来不被索引号相关联。所以如果你需要找到索引,你必须遍历整个列表。否则,链接列表和具有索引的数组之间会有什么区别。链表是动态的。所以你要么动态地跟踪指数,要么使用我在开头提到的方法。 – Sohaib 2013-04-21 15:44:13

+0

感谢您的回复。我建立了自己的搜索功能,比我预想的要快得多!对于大数据集,我会考虑接受的答案。干杯! – 2013-04-21 16:10:27

回答

0

也许你应该简单地存储你的对象在HashMap<key,value>
你把一个对象作为值与一个关键。如果你想搜索一个对象,你只需要通过键。所以举个例子,如果你的类是唯一的,那么你需要使用objectID作为key。

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

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

list.get(newId); 

如果newId不exsist它return null

+0

感谢您的回复。我建立了自己的搜索功能,比我预想的要快得多!对于大数据集,我会考虑接受的答案。干杯! – 2013-04-21 16:11:02

+0

你的欢乐和感谢 – BennX 2013-04-21 16:15:04

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方法的一般约定,该方法声明相等对象必须具有相同的哈希码。

0

这可以在ListindexOf()法的角度来实现的,所有你需要做的是覆盖equals()myClasshashChode()指定使用id属性的比较必须作出(here就是为什么一个解释你需要重写这两个方法)。只需将此方法添加到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一个构造函数的id作为参数。

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()方法也必须重写,因为二等于对象必须有相同的hashCode:

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

注意,如果你不希望两个实例被认为是相等的,当它们具有相同的ID这样做,那么你比迭代列表,并寻找其他别无选择第一个元素与您正在查找的实例具有相同的ID。或者您必须使用其他数据结构,例如Map<Integer, MyClass>

0

你可以像下面这样做

list.indexOf(new Object() { 
     @Override 
     public boolean equals(Object o) { 
      MyClass mine = (MyClass) o; 
      return mine.id == yourValue; 
     } 
    });