我使用java.util.Hashtable创建了一个java字典,其中包含2元组的字符串作为键,int作为值。
class pair<e,f>{
public e one;
public f two;
}
我曾经在上面的类中初始化字典:
Dictionary<pair<String, String>, Integer> dict = new Hashtable();
现在我无法检查dict中是否存在密钥,我的意思是我无法将字符串作为参数传递给dict.containsKey()方法。
答案 0 :(得分:2)
您需要为要用作Hashtable键的内容实现hashCode
和equals
。如果不这样做,则使用默认机制,它将使用对象标识,而不是对象相等(意味着即使两个元组包含“相等”条目,两个元组也不相等)。
关键字段应该是不可变的,否则它也会破坏事物。
答案 1 :(得分:1)
尝试这样的事情:
public class Pair<E, F> {
private final E e;
private final F f;
public Pair(E e, F f) {
this.e = e;
this.f = f;
}
public E getE() {
return e;
}
public F getF() {
return f;
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Pair<E,F> other = (Pair<E,F>) obj;
if (!this.e.equals(other.getE())) {
return false;
}
if (!this.f.equals(other.getF())) {
return false;
}
return true;
}
@Override
public int hashCode() {
hash = 53 * e.hashCode() + f.hashCode();
return hash;
}
}
我认为e
和f
不是null
。如果它可以是null
,那么您必须在e == null
之前检查if(e.equals(other.getE())
是否阻止了NPE。
补充说明:
在几乎所有情况下,您都应该将课程成员设置为private
(static
成员除外)。
Proper Java convention is to have class names in CapitalizedWords
Generic type parameters should be a single upper-case character