Java 字符串数组的哈希码

标签 java

我想为包含二维字符串数组(如 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/

相关文章:

如果任一值为 null,则 Java Stream 返回 null

java 类路径 unix

java - JComboBox显示值

Java 获取字符串的第一个字符值

java - JButton 内的上划线文本

java - 如何使模型更改在 JDatePicker 上可见?

java - 在html表中显示ResultSet中的数据

Java:JPanel 在 CardLayout 中无法正确显示

java - 通过java运行Shell命令

java - 8位灰度图像字节数组转jpg