1

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

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
}

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

PS CustomSet 是另一个用户定义的类,在我看来无关紧要

4

2 回答 2

6

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

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

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

于 2012-11-03T21:16:25.650 回答
2

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

这个:

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.

解决方案涉及重新定义equals使用keys区分对象的方法。所以在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;
}
于 2012-11-03T21:21:39.643 回答