ArrayList作为HashMap中的键
java
nlp
5
0

是否可以添加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;
}
参考资料:
Stack Overflow
收藏
评论
共 3 个回答
高赞 时间 活跃

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

class Bigram{
    private String firstItem;
    private String secondItem;

    <getters/setters>

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

    @Override 
    public boolean equals(){
        ...
    }
}

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

收藏
评论

是的,您可以将ArrayList作为哈希映射中的键,但这是一个非常糟糕的主意,因为它们是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);
    }
}
收藏
评论

文档中

注意:如果将可变对象用作地图键,则必须格外小心。如果一个对象的值在影响的方式改变时没有指定映射的行为equals比较而对象在地图的键。此禁止的一种特殊情况是,不允许地图包含自身作为键。虽然允许映射包含自身作为值,但建议格外小心:在此类映射上不再很好地定义equalshashCode方法。

为了使用hashCodeequals ,在将可变对象用作键时必须小心。

最重要的是,最好使用不可变的对象作为键。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号