是否可以添加一个ArrayList
作为关键HashMap
。我想保留二元组的频率计数。二元组是键,值是它的频率。
对于每个像“他是”这样的二元组,我创建了一个ArrayList
并将其插入到HashMap
。但我没有得到正确的输出。
public HashMap<ArrayList<String>, Integer> getBigramMap(String word1, String word2) {
HashMap<ArrayList<String>, Integer> hm = new HashMap<ArrayList<String>, Integer>();
ArrayList<String> arrList1 = new ArrayList<String>();
arrList1 = getBigram(word1, word2);
if (hm.get(arrList1) != null) {
hm.put(arrList1, hm.get(arrList1) + 1);
} else {
hm.put(arrList1, 1);
}
System.out.println(hm.get(arrList1));
return hm;
}
public ArrayList<String> getBigram(String word1, String word2) {
ArrayList<String> arrList2 = new ArrayList<String>();
arrList2.add(word1);
arrList2.add(word2);
return arrList2;
}
是的,你可以拥有ArrayList
s 作为哈希映射中的键,但它是非常糟糕的主意因为他们是mutable.
如果您更改ArrayList
以任何方式(或其任何元素),映射基本上都会丢失,因为密钥不会具有相同的hashCode
就像插入时一样。
经验法则是仅使用不可变数据类型作为哈希映射中的键。正如 Alex Stybaev 所建议的,您可能想要创建一个Bigram
像这样的类:
final class Bigram {
private final String word1, word2;
public Bigram(String word1, String word2) {
this.word1 = word1;
this.word2 = word2;
}
public String getWord1() {
return word1;
}
public String getWord2() {
return word2;
}
@Override
public int hashCode() {
return word1.hashCode() ^ word2.hashCode();
}
@Override
public boolean equals(Object obj) {
return (obj instanceof Bigram) && ((Bigram) obj).word1.equals(word1)
&& ((Bigram) obj).word2.equals(word2);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)