我有一个条目矢量。每个条目都是此类的一个实例:
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是另一个用户定义的类,与我的观点无关
答案 0 :(得分:5)
您必须重新定义equals
类中的Entry
方法,因为这是contains
依赖于确定元素是否属于集合的内容,正如文档所说:
如果此向量包含指定的元素,则返回true。更多 正式地,当且仅当此向量至少包含时才返回true 一个元素e使得(o == null?e == null:o.equals(e))。
在这种情况下,o
是contain
的方法参数。
答案 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;
}