ArrayList作为HashMap中的键

the*_*tna 17 java nlp hashmap

是否可以添加一个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)


Ale*_*aev 3

为什么你不能使用这样的东西:

class Bigram{
    private String firstItem;
    private String secondItem;

    <getters/setters>

    @Override
    public int hashCode(){
        ...
    }

    @Override 
    public boolean equals(){
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

而不是对有限数量的项目(两个)使用动态集合。

  • 我什至会忽略设置器并使其不可变。可能没有理由在构造后更改该类的对象。 (2认同)