[英]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')
在您的代碼中,它不需要C
, D
, E
。 因為這些被編譯器忽略。
包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.