2010-02-02 103 views
1

我一直在努力創建一個函數,以實質上找到多維數組中所有重複元素的索引(未排序),在這種情況下是一個5x5數組,然後使用索引發現改變並行元素在一個得分數組中。但只能在列中找到重複項,而不能與數組中的其他列相比較。以下是我迄今爲止所做的與在線研究。這個代碼的主要問題是它會找到所有重複的元素,但不是原件。例如:如果數組包含以下元素: {{「a」,「a」,「a」},{「b」,「b」,「b」},{「a」,「c」,「一個「}},那麼它應該將並行分數數組更改爲:{{0,1,0},{1,1,1},{0,1,0}}。但是,它只能識別最後一行,並排在頂行的重複位置之上。查找重複數組元素

代碼:

public static void findDuplicates(String a[][]) 
{ 
    System.out.println("*Duplicates*"); 
    Set set = new HashSet(); 
    for(int j = 0; j<a.length; j++) 
    { 
     for(int i=0; i < a[0].length; i++) 
     { 
      if(!set.contains(a[i][j])) 
      { 
       set.add(a[i][j]); 
      } 
      else 
      { 
       System.out.println("Duplicate string found at index " + i + "," + j); 
       scores[i][j] -= scores[i][j]; 
      } 

     } 
     set = new HashSet(); 
    } 
} 

我知道我的解釋是有點複雜,但希望它是足夠的理解。謝謝, 傑克。

回答

3

您的邏輯錯誤。你外環是j和內環爲i,但你正在做的:

set.add(a[i][j]); 

它應該是周圍的其他方法:

set.add(a[j][i]); 

從技術上講,你可以,如果數組得到一個越界異常不是NxN。但你可以說這是一個先決條件。

出於某種原因,你也設置爲0,與:

scores[i][j] -= scores[i][j]; 

爲什麼不乾脆:

scores[i][j] = 0; 

但要列中找到重複:

public static void findDuplicates(String a[][]) { 
    for (int col=0; col<a[0].length; col++) { 
    Map<String, Integer> values = new HashMap<String, Integer>(); 
    for (int row=0; row<a.length; row++) { 
     Integer current = values.put(a[row][col], row); 
     if (current != null) { 
     scores[row][col] = 0; 
     scores[current][col] = 0; 
     } 
    } 
    } 
} 

如何這項工作?

  • 我已將循環變量重命名爲rowcol。當rowcol更具描述性時,沒有理由使用ij;
  • 像你我假設輸入數組是正確的作爲一個先決條件。然而,它可以是N×M(而不僅僅是N×N)我使用Map來存儲每個值的索引。如果密鑰已經在Map中,則Map.put()返回舊值。如果是這種情況,你會發現重複;
  • 當前(行,列)和(當前,列)設置爲0.爲什麼從自己減去分數而不是簡單地設置爲0?
  • 如果在列中發現3次以上的值「a」,則scores[current][col]將被設置爲0多次,這是不必要的,但不是有害的,並且使得代碼更簡單。
  • 我已經使用泛型聲明Map。這是有用和可取的。它說,MapString鍵和Integer值,從而節省一些鑄造;
  • 它還使用了自動裝箱和自動拆箱到int(循環變量)轉換爲從包裝類Integer