我想为包含二维字符串数组(如 String[][])的对象创建一个哈希码和相等函数。如何创建有效的哈希码和相等函数来匹配行的内容。例如,我想要匹配以下内容。
String[][] str1={{"A","B"},{"C","D","E"}};
String[][] str2={{"C","D","E"},{"A","B"}};
eclipse或netbean生成的代码不起作用。我猜想迭代数组的所有单元格然后对单个单元格的哈希码求和可能会出现问题(可能存在哈希冲突),如下所示。即使注释行也不起作用。
int hash =0, xor=tran[0][0].hashCode()*97;
for(int i=0;i<tran.length;i++){
for(int j=0;j<tran[i].length;j++){
hash+=tran[i][j].hashCode()*97;
//hash= hash*97 + tran[i][j].hashCode();
xor^=tran[i][j].hashCode()*97;
}
}
在嵌套循环中使用XOR(如第三条语句)会出现问题吗?
最佳答案
似乎您想忽略外部数组中内部数组的顺序。 Set
契约(Contract)就是您所需要的:Set
equals 和 hashCode 方法假设元素没有特定的顺序。 Set
元素可以是List
(如果 {"C", "D", "E"}
不等于 {"D", "C", "E"}
)或再次 Set
(如果内部元素顺序也无关紧要)。因此,最好摆脱数组并将数据存储在 Set<List<String>>
中。或Set<Set<String>>
。以下是如何转换它的示例:
public static Set<List<String>> asSet(String[][] input) {
Set<List<String>> result = new LinkedHashSet<>();
for(String[] row : input) {
result.add(Arrays.asList(row));
}
return result;
}
用法:
String[][] str1={{"A","B"},{"C","D","E"}};
String[][] str2={{"C","D","E"},{"A","B"}};
Set<List<String>> set1 = asSet(str1);
Set<List<String>> set2 = asSet(str2);
System.out.println(set1.equals(set2)); // true
所以你不需要任何特殊的对象,只需使用 JDK 中已经提供的对象即可。
关于Java 字符串数组的哈希码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32431965/