2012-01-09 20 views
0

我正在嘗試編寫my previous topic中描述的問題的代碼。建議的解決方案是使用hashmaps在多個數組中找到相似的條目(數組具有相同數量的列,但它們可能具有不同的行數)。用於在多個二維數組中搜索相似條目的代碼

以下是我的示例代碼,其基於用戶John B的代碼片段here提供。爲了簡單和調試目的,我創建了3個不同的一維行而不是二維數組。另外,爲了簡單起見,函數equalRows應該返回truefalse而不是行索引。

那麼,在下面的代碼的功能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。那麼,任何解決方案?

回答

2

此行是錯誤的,它會立即返回true:

if (array1Row != null && array2Row != null) { 
    return true; 
} 

那你必須做的就是這個(完全顛倒邏輯):

if (array1Row == null || array2Row == null) { 
    return false; 
} 
+0

我用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

+0

它的工作原理。對不起。 – 2012-01-10 07:49:04

1

它是隻得到儘可能測試每個數組中的第一個元素,並返回true,因爲它們匹配。

如果任何匹配失敗,則需要返回false,如果沒有失敗,則返回true。

我還會在equalRows方法的開始處對長度進行測試。