2015-05-17 143 views
0

我有一種方法可以生成一個字符串的二維數組,然後將它們放在一個ArrayList。我正在嘗試編寫一種方法,該方法需要一個新的2D數組,並將其與陣列中已有的數據進行重複檢查。這是我迄今爲止,它應該返回true一個新的解決方案,但它每次返回false。調用方法打印出陣列,我可以看到它們不一樣。比較字符串的二維數組

public static boolean tester(String[][] b, ArrayList<String[][]> s) 
{ 
    if (s.size() == 1) return true; 
    boolean n = true; 
    int count; 
    int size = b.length * b[0].length; 

    for (int i = 0; n && i < s.size() -1; i ++) 

    { 
     count = 0; 
     for (int j = 0; j < s.get(i).length; j ++) 
      for (int k = 0; k < s.get(i)[0].length; k ++) 
       if (s.get(i)[j][k].equals(b[j][k])) count ++; 
        if (count == size) n = false; 

    } 

    return n; 
} 
+1

*「字符串的雙陣列」 *其稱爲二維陣列,或二維數組短。編程中的'double'這個術語是'保留'的,用於'double'類型。與你的回答/問題無關,但我必須閱讀一些句子以確保我正在低估它;) –

回答

0

您的代碼可以得到方式簡單使用Arrays.deepEquals

public static boolean nonDuplicate(ArrayList<String[][]> s, String[][] b){ 

    for(String[][] e : s){ 
     if(Arrays.deepEquals(e, b)) return false; //e and b are duplicates 
    } 

    return true; 
} 

您的代碼可能是不正確的,因爲你沒有使用大括號({})在你的for循環。所以,當你說:

for (int j = 0; j < s.get(i).length; j ++) 
     for (int k = 0; k < s.get(i)[0].length; k ++) 
      if (s.get(i)[j][k].equals(b[j][k])) count ++; 
       if (count == size) n = false; 

它被解釋爲:

 for (int j = 0; j < s.get(i).length; j ++){ 
     for (int k = 0; k < s.get(i)[0].length; k ++){ 
      if (s.get(i)[j][k].equals(b[j][k])) count ++; 
     } 
     } 

     if (count == size) n = false; 

這很可能不是你的意識判定你的壓痕,但值得注意的是白色空間(包括縮進)並不意味着(?)除了分離令牌外,還有很多Java。

+0

deep.equals的解決方案仍然每次都會返回false ...我開始懷疑如果在代碼的其他地方發生了一些奇怪的事情,然而,我將每個二維數組打印出來,因爲它被添加到數組列表中,我可以看到它們不是相同的,所以我不知道它可能是什麼。 – cae52

+0

嘿,謝謝你的幫助。這實際上是程序中其他地方的一個問題 - 數組列表完全充滿了對相同d2d darrays的引用。 – cae52

0

這是怎麼了你的代碼被編譯器解釋:

for (int i = 0; n && i < s.size() -1; i ++) 
{ 
    count = 0; 
    for (int j = 0; j < s.get(i).length; j ++) { 
     for (int k = 0; k < s.get(i)[0].length; k ++) {   
      if (s.get(i)[j][k].equals(b[j][k])) count ++; 
     } 
    } 
    if (count == size) n = false; 
} 

恕我直言盡力總是使用{}闡明你的意圖,你的代碼的編譯器/讀寫器。

我猜你想是這樣的:

for (int i = 0; n && i < s.size() -1; i ++) 
{ 
    count = 0; 
    for (int j = 0; j < s.get(i).length; j ++) { 
     for (int k = 0; k < s.get(i)[0].length; k ++) {   
      if (s.get(i)[j][k].equals(b[j][k])) { 
       count ++; 
      } 
      if (count == size) { 
       n = false; 
      } 
     } 
    } 
} 

但你也可以這樣寫:

public static boolean tester(String[][] b, ArrayList<String[][]> s) 
{ 
    // .. 

    for (int i = 0; n && i < s.size() -1; i ++) { 
     for (int j = 0; j < s.get(i).length; j ++) { 
      for (int k = 0; k < s.get(i)[0].length; k ++) { 

       if (s.get(i)[j][k].equals(b[j][k]) == false) { 
        return true; 
       } 
      } 
     } 
    } 

    return false; 
} 
+0

如果明白寫,不會停止並返回「假」,只要它不符合數組列表中的任何一個2D數組?我需要它繼續瀏覽整個列表。 – cae52