如何检查java中vector中的用户自定义条目?

时间:2012-11-03 21:14:01

标签: java vector contains comparable

我有一个条目矢量。每个条目都是此类的一个实例:

public class Entry implements Comparable<Entry>{

    private String _key;
    private CustomSet _value;

    [...]

    @Override
    public int compareTo(Entry a) {
        return this._key.compareTo(a._key);
    }
}

向量声明如下:

Vector<Entry> entries = new Vector<Entry>();

之后,填充向量。然后我想检查某个键是否在向量中的某个位置。所以我这样做:

Entry sample = new Entry(key, new CustomSet());
if (entries.contains(sample)) {
    // do something
}

这似乎不起作用。为什么?我怎样才能让它发挥作用?

P.S。 CustomSet是另一个用户定义的类,与我的观点无关

2 个答案:

答案 0 :(得分:5)

您必须重新定义equals类中的Entry方法,因为这是contains依赖于确定元素是否属于集合的内容,正如文档所说:

  

如果此向量包含指定的元素,则返回true。更多   正式地,当且仅当此向量至少包含时才返回true   一个元素e使得(o == null?e == null:o.equals(e))。

在这种情况下,ocontain的方法参数。

答案 1 :(得分:2)

问题是您没有相同的对象,您有两个具有相同Key的不同对象。

此:

Entry sample = new Entry(key, new CustomSet());

创建一个新对象,如果你现在执行entries.add(sample)并尝试执行entries.contains(sample),它将返回true,因为它确实是同一个对象。但如果您已经做过(例如),那就不行了:

 Entry sample = new Entry(key, new CustomSet());
 Entry sample1 = new Entry(key, new CustomSet());

 entries.add(sample);

 if(entries.contains(sample1)) // It will still return false.

解决方案涉及使用key重新定义equals具有比较论据。所以在Entry类中你应该添加:

 public boolean equals(Object o)
 {
       if(o == null || !getClass().equals(o.getClass()))  return false;
       if(o == this)  return true;

       Entry p = (Entry) o;
       return this.key.compareTo(p.key) == 0 ? true : false;
}