3

我正在尝试制作二维哈希集功能。我有一个循环遍历整数对:

        ResultSet getAssociations;
        Statement getAssociationsSelect = sqlConn
                .createStatement();
        getAssociations = getAssociationsSelect
                .executeQuery("SELECT ProductId, ThemeId FROM ProductTheme");
        while(getAssociations.next()) {
            int productId1 = getAssociations.getInt(1);
            int themeId1 = getAssociations.getInt(2);
        }

当当前的整数对与前一对整数不匹配时,我想存储它们。我认为哈希集将是最好的方法,因为我可以插入对并且不会重复。我该怎么做呢?

4

4 回答 4

4

我想你可能有点过度思考这个问题。我建议如下:

Map<Integer, Set<Integer>> map = new HashMap<Integer, Set<Integer>>();
if(!map.containsKey(productId))
    map.put(productId, new HashSet<Integer>());
map.get(productId).add(themeId);

这样,您就可以Set将所有themeIds映射到给定的productId,在创建具有易于迭代格式的对象时保证唯一性。

于 2013-09-03T19:28:12.423 回答
2

创建一个新对象,它可以作为基于 productId1 和 themeId1 的复合键。确保并实现 equals 和 hashCode 方法,并将这些对象存储在 Set 中。

public class AssociationReference() {
    private int productId;
    private int themeId;

    //constructor/getters/setters

    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + productId;
        result = prime * result + themeId;

        return result;
    }

    public boolean equals(Object obj) {

    }

}

现在您可以使用 HashSet 并且只存储唯一值。如果需要存储更多,也可以将此对象用作 HashMap 上的 Key。

我会避免通过连接值来创建键,除非你确定范围永远不会改变,并且你小心地填充你的数字以免发生冲突(即 9 和 11 应该是 00090011 而不是 911 以便区别于 91 和 1)。

于 2013-09-03T19:20:48.197 回答
1

我会用一个HashMap<Long, Association>

作为我会使用的键ProductId * 1000000 + ThemeId,它们看起来像这样:

32000064 for ProductId = 32 and ThemeId = 64

一定要在你的课堂上实施equalshashcodeAssociation

于 2013-09-03T19:23:22.977 回答
1

如果您想要一个非常简单的解决方案,请连接两个键并存储结果字符串,例如

String newKey = String.format( "%d-%d.", productId1 , themeId1 );

它总是会为每个组合生成一个唯一的密钥。

于 2013-09-03T20:00:05.420 回答