我正在尝试制作二维哈希集功能。我有一个遍历整数对的循环:
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);
}
当前一对整数与前一对整数不匹配时,我想存储它们。我认为一个hashset将是最好的方法,因为我可以插入对,它不会重复。我该怎么做?
答案 0 :(得分:3)
我想你可能会过度思考这个问题。我建议如下:
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
,在创建具有易于迭代格式的对象时保证唯一性。
答案 1 :(得分: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,并且只存储唯一值。如果需要存储更多内容,也可以将此Object用作HashMap上的Key。
我会避免通过结合值来创建一个键,除非你确定范围永远不会改变,并且你要小心填充你的数字以便不会发生碰撞(即9和11应该是00090011而不是911所以可以与91和1)区别开来。
答案 2 :(得分:1)
我会使用HashMap<Long, Association>
作为Keys,我会使用ProductId * 1000000 + ThemeId
所以它们看起来像这样:
32000064 for ProductId = 32 and ThemeId = 64
确保在equals
课程中实施hashcode
和Association
答案 3 :(得分:1)
如果你想要一个非常简单的解决方案来连接两个密钥并存储结果字符串,例如
String newKey = String.format( "%d-%d.", productId1 , themeId1 );
它将始终为每个组合生成一个唯一的密钥。