Java 创建二维哈希集功能

Java 创建二维哈希集功能,java,Java,我正在尝试创建二维哈希集功能。我有一个循环,循环遍历整数对: ResultSet getAssociations; Statement getAssociationsSelect = sqlConn .createStatement(); getAssociations = getAssociationsSelect .executeQuery("SELECT ProductId, T

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

        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);
        }

当当前的一对整数与前一对整数不匹配时,我想存储它们。我认为哈希集是最好的方法,因为我可以插入对,而且不需要重复。如何执行此操作?

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

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上的键


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

我会使用
哈希映射

作为键,我将使用
ProductId*1000000+ThemeId
,因此它们看起来如下所示:

32000064 for ProductId = 32 and ThemeId = 64

请确保在您的
关联
类中实现
等于
哈希代码
,我认为您可能对这个问题考虑过多了。我建议如下:

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);
Map Map=newhashmap();
如果(!map.containsKey(productId))
put(productId,newhashset());
get(productId).add(themeId);

这样,您就有了一个映射到给定
产品ID
的所有
主题的
集合
,在创建一个易于使用格式的对象时保证了唯一性。

如果您想要一个真正简单的解决方案,请将两个键串联起来并存储结果字符串,例如

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

它将始终为每个组合生成一个唯一的键。

您知道id可以有多大吗?哈希映射不是更好的方法吗?如果您将两个数字连接成一个字符串,如“321-32”,那么有什么理由不选择不同的ProductId吗,MEID
?我的第一个想法是一个包含两个整数的小助手类。重写hashCode方法,以便确保两个实例相等当且仅当ProductId相等且ThemeId相等时。HashSet应该完成其余的工作。更简单的方法是使用HashSet,并将这两个整数组合成long的高/低端。这样,您就不必担心溢出或ID比最初预期的长。