我正在嘗試編寫my previous topic中描述的問題的代碼。建議的解決方案是使用hashmaps在多個數組中找到相似的條目(數組具有相同數量的列,但它們可能具有不同的行數)。用於在多個二維數組中搜索相似條目的代碼
以下是我的示例代碼,其基於用戶John B的代碼片段here提供。爲了簡單和調試目的,我創建了3個不同的一維行而不是二維數組。另外,爲了簡單起見,函數equalRows
應該返回true
或false
而不是行索引。
那麼,在下面的代碼的功能equalRows
應該返回false
,因爲array3
有{1,3,4}
,它確實有{1,2,3}
。函數返回true
。爲什麼會發生?
import java.util.HashMap;
import java.util.Map;
public class Test {
public static void main(String[] args) {
int[] array1 = {1,2,3};
int[] array2 = {1,2,3};
int[] array3 = {1,3,4};
boolean answ = equalRows(array1,array2,array3);
System.out.println(answ);
}
static class Row extends Object {
private int value;
private volatile int hashCode = 0;
public Row(int val) {
this.value = val;
}
@Override
public boolean equals(Object obj) {
if(this == obj)
return true;
if((obj == null) || (obj.getClass() != this.getClass()))
return false;
// object must be Row at this point
Row row = (Row)obj;
return (value == row.value);
}
@Override
public int hashCode() {
final int multiplier = 7;
if (hashCode == 0) {
int code = 31;
code = multiplier * code + value;
hashCode = code;
}
return hashCode;
}
}
private static Map<Row, Integer> map(int[] array) {
Map<Row, Integer> arrayMap = new HashMap<Row, Integer>();
for (int i=0; i<array.length; i++)
arrayMap.put(new Row(array[i]), i);
return arrayMap;
}
private static boolean equalRows(int[] array1, int[] array2, int[] array3){
Map<Row, Integer> map1 = map(array1);
Map<Row, Integer> map2 = map(array2);
for (int i=0; i<array3.length; i++){
Row row = new Row(array3[i]);
Integer array1Row = map1.get(row);
Integer array2Row = map2.get(row);
if (array1Row != null || array2Row != null) {
return false;
}
}
return true;
}
}
編輯#1 代碼更新受到建議的解決方案。
編輯#2 我檢出了建議的解決方案,但函數返回false即使是:int [] array1 = {1,2,3}; int [] array2 = {1,2,3}; int [] array3 = {1,2,3},雖然它應該是真的。我認爲問題出在功能hashcode
。那麼,任何解決方案?
我用int [] array1 = {1,2,3}查看了它; int [] array2 = {1,2,3}; \t \t int [] array3 = {1,2,3},雖然它應該是true;它由於某種原因返回false。我認爲問題是與函數哈希碼...(?) – 2012-01-09 21:34:48
它的工作原理。對不起。 – 2012-01-10 07:49:04