我有一个小错误,可能源于我对HashMap的误解,它杀了我。我已经提供了一小段测试代码来说明问题。
为了简洁,我省略了Prefix类,但我的前缀只是单词的数组。它们是不可变的,因此在构造它们时克隆传递给构造函数的字符串数组。实现了Hashcode()
和equals()
方法,因此条件传递。本质上问题是我只能使用prefix1而不是prefix2取消引用后缀列表(在后一种情况下它会返回null。
仅供参考,我的Hashmap只是声明为:
// Stores mappings between "prefixes" (consecutive word phrases) and "suffixes" (successor words).
private Map<Prefix, ArrayList<String>> prefixSuffixPairs;
感谢任何帮助。
ArrayList<String> suffixInList = new ArrayList<String>();
suffixInList.add("Suffix1");
suffixInList.add("Suffix2");
String[] prefixWords1 = new String[] {"big", "the"};
Prefix prefix1 = new Prefix(prefixWords1);
String[] prefixWords2 = new String[] {"big", "the"};
Prefix prefix2 = new Prefix(prefixWords2);
prefixSuffixPairs.put(prefix1, suffixInList);
if(prefix1.hashCode() == prefix2.hashCode()) {
System.out.println("HASH CODE MATCH");
}
if(prefix1.equals(prefix2)) {
System.out.println("VALUES MATCH");
}
ArrayList<String> suffixOutList = null;
suffixOutList = prefixSuffixPairs.get(prefix2);
suffixOutList = prefixSuffixPairs.get(prefix1);
public int hashCode() {
int result = 1;
for( int i = 0; i< words.length; i++ )
{
result = result * HASH_PRIME + words[i].hashCode();
}
return result;
}
public boolean equals(Prefix prefix) {
if(prefix.words.length != words.length) {
return false;
}
for(int i = 0; i < words.length; i++) {
if(!prefix.words[i].equals(words[i])) {
return false;
}
}
return true;
}
答案 0 :(得分:4)
public boolean equals(Prefix prefix) {
它不会覆盖Object#equals(因此HashMap不会使用它)。
您只是提供了一个不相同的同名方法(重载) - 但您可以从下面的方法中调用它:
尝试
@Override
public boolean equals(Object prefix) {
@Override
并不是绝对必要的,但是如果你将它应用到你的第一个方法,它会使编译器能够检测到这个问题(当你的断言被覆盖错误时会出现错误)。