是否可以添加一个ArrayList键作为HashMap.我想保留双字母的频率数.二元组是关键,价值就是它的频率.
对于像"他是"这样的每个双子星,我创建一个ArrayListfor it并将其插入到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;
}
Run Code Online (Sandbox Code Playgroud)
aio*_*obe 27
是的,你可以将ArrayLists作为哈希映射中的键,但这是一个非常糟糕的主意,因为它们是可变的.
如果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);
}
}
Run Code Online (Sandbox Code Playgroud)
为什么你不能使用这样的东西:
class Bigram{
private String firstItem;
private String secondItem;
<getters/setters>
@Override
public int hashCode(){
...
}
@Override
public boolean equals(){
...
}
}
Run Code Online (Sandbox Code Playgroud)
而不是对有限数量的项目(两个)使用动态集合。