簡體   English   中英

字符串數組的Java哈希碼

[英]Java hashcode for String Array

我想為一個包含二維字符串數組(如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合同: Set equals和hashCode方法假定元素沒有特定順序。 Set元素可以是List (如果{"C", "D", "E"}不等於{"D", "C", "E"} ),也可以是Set (如果內部元素order也不同)問題)。 因此,最好刪除數組並將數據存儲在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中已經提供的對象即可。

如果需要str1 [] []具有與str2 [] []相同的哈希碼,則可以在數組中使用每個char的整數值,例如:

String [] [] str1 = {{“ A”,“ B”},{“ C”,“ D”,“ E”}}};

str1哈希碼= int(A)* 0 + int(B)* 1 + int(C)* 0 + int(D)* 1 + int(E)* 2

應用相同的ot str2Hashcode,其中0、1,...是列號,這樣做將使給定二維數組的哈希碼與包含相同行的任何數組匹配,無論它們的順序如何。

String[][] str1={{"A","B"},{"C","D","E"}};    
str1[0][0].hashCode=65 (Ascii code of 'A')
str1[0][1].hashCode=66 (Ascii code of 'B')

在您的代碼中,它不需要CDE 因為這些被編譯器忽略。

包com.bnymellon.javaprograms; 公共課程Test11 {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    String[][] str1={{"A","B"},{"C","D","E"}};
    String[][] str2={{"C","D","E"},{"A","B"}};
    String[][] str3={{"G","c"},{"f","B","c"}};
    int n=2;
    for(int i=0;i<1;i++)
         for(int j=0;j<20;j++)
        {   
            System.out.println(str1[i][j]);   
        }
}

}輸出:線程“ main”中的AB異常java.lang.ArrayIndexOutOfBoundsException:com.bnymellon.javaprograms.Test11.main(Test11.java:14)為2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM