2016-04-21 71 views
0

(更新) 我很難找出在這裏做什麼,我需要比較一個2d數組,以查看是否有任何數字匹配。我需要四個數字來匹配上/下,左/右或對角線。我只是無法得到它來測試下/左斜線(/)這是我更新的代碼java 2d數組比較UPDATED

public static boolean isAdjacentFour(int[][] a) { 
    // Code to test if column has four adjacent numbers 
    for (int row = 0; row <= a.length - 3 ; row++) { 
     for (int col = 0; col <= a[0].length - 1 ; col++) { 
      if (a[row][col] == a[row+1][col] && a[row+2][col] == a[row][col] 
        && a[row+3][col] == a[row][col]) { 
       return true; 
      } 
     } 
    } 
    // Code to test if row has four adjacent numbers 
    for (int row = 0; row <= a.length - 1 ; row++) { 
     for (int col = 0; col <= a[0].length - 3 ; col++) { 
      if (a[row][col] == a[row][col+1] && a[row][col] == a[row][col+2] 
        && a[row][col] == a[row][col+3]) { 
       return true; 
      } 
     } 
    } 
     // Code to test if there are 4 adjacent numbers in a down/right (\)diagonal 
     for (int row = 0; row <= a.length - 3 ; row++) { 
      for (int col = 0; col <= a[0].length - 3 ; col++) { 
       if (a[row][col] == a[row+1][col+1] && a[row][col] == a[row+2][col+2] 
         && a[row][col] == a[row+3][col+3]) { 
        return true; 
       } 
      } 
     } 
     for (int row = 0; row <= a.length - 3 ; row++) { 
      for (int col = 0; col <= a[0].length + 3 ; col--) { 
       if (a[row][col] == a[row+1][col-1] && a[row][col] == a[row+2][col-2] 
         && a[row][col] == a[row+3][col-3]) { 
        return true; 
       } 
      } 
     } 

    return false; 
} 
+1

'[row + 2]'和'[row + 3]'是錯誤的原因,設置循環條件爲'row 11thdimension

+0

上面的評論是正確的,除了我的答案我做了行<= a.length - 4來解決它,但都是可以接受的。 –

回答

1

嗯一個問題,我在第一嵌套for循環注意到的是這行代碼,

for (int row = 0; row <= a.length - 3 ; row++) 

現在你已經有了這種方式,行變量會隨着outer for循環的每次迭代而遞增。但是,如何執行程序,條件應該是row <= a.length - 4,這是爲什麼。假設你有一個四乘四維的二維數組。嵌套的for循環將經歷內循環的一次正常迭代,實際上它會檢查每一列以找出列中四個連續匹配數字的可能匹配。下面是它看起來在實際運行程序開始在外部for循環和行= 0一樣,

迭代一個內部的for循環:

if (a[0][0] == a[1][0] && a[2][0] == a[0][0] && a[3][0] == a[0][0]) 

迭代內的兩個for循環:

if (a[0][1] == a[1][1] && a[2][1] == a[0][1] && a[3][1] == a[0][1]) 

迭代內的三個for循環:

if (a[0][2] == a[1][2] && a[2][2] == a[0][2] && a[3][2] == a[0][2]) 

末伊特拉內部for循環:

if (a[0][0] == a[1][3] && a[2][3] == a[0][3] && a[3][0] == a[0][3]) 

一旦完成此操作,行變量將根據外部循環定義遞增。這是最有可能導致錯誤,因爲現在當我們開始通過與行= 1內循環迭代,出現這種情況

迭代一個內部的for循環:

if (a[1][0] == a[2][0] && a[3][0] == a[1][0] && a[4][0] == a[1][0]) 

在這裏,我們已經有嘗試訪問4x4二維數組中的第5行時的indexoutofboundsexception。所以在這裏簡單的解決方法是改變

for(int row = 0; row <= a.length - 3 ; row++)

for(int row = 0; row <= a.length - 4 ; row++)` 

類似的觀點可以爲第二個嵌套的for循環進行。如果你不相信我,就做一些類似於我爲這些行做的事情,然後用4x4二維數組寫出它的迭代。在外部for循環的第一次迭代中以及在row = 0和col = 1時內部for循環的第二次迭代中,您將得到arrayindexoutofbounds異常,從而導致程序在第一行的第五列進行檢查的二維數組。所以,簡單的解決應以改變

for (int col = 0; col <= a[0].length - 3 ; col++) 

for (int col = 0; col <= a[row].length - 4 ; col++) 

就個人而言,我更喜歡使用[行]。長度只因爲可能有某些情況下它不是一個完美的n×n的二維數組。例如,某些行可能只有3列,其中第一行有7列。如果是這種情況,那麼您將遇到outofbounds異常,以嘗試訪問第一行中存在的其他行中不存在的列。

對於第三嵌套for循環中,再次,相同的參數可以只是通過寫出來的迭代製成,它應改爲

for(int row = 0; row <= a.length - 4 ; row++) { 
     for(int col = 0; col <= a[row].length - 4 ; col++) 

最後嵌套for循環具有關於內部邏輯問題for循環。由於您從0開始遞減,因此只會嘗試訪問數組中的負數索引,從而會遇到越界異常。因此,簡單的修復應該是將col初始化爲最後一列,並將條件更改爲col大於或等於3,因爲您要訪問列col,col-1,col-2和col-3上的元素。如果這是令人困惑的,那就考慮一下吧。你正在檢查從col開始的列和前面的三個列。如果甚至沒有四列的話,該怎麼辦?這就是爲什麼有條件col >= 3,因爲你檢查一列和它之前的三列,直到你到達第4列(col = 3)。一旦到達第3列(col = 2),就沒有辦法檢查該列和之前的三個列表,因爲此時只有3列要檢查。關於-3的變化應該與for (int row = 0; row <= a.length - 3 ; row++)相似,其他3個嵌套循環的變化。它應該看起來像這樣,

for (int row = 0; row <= a.length - 4 ; row++) { 
      for (int col = a[row].length - 1; col >= 3; col--) 
+0

謝謝......這有助於 – UchiaSky

+0

任何時候,如果你發現答案有幫助,請點擊複選標記將其標記爲已接受。另外,如果你需要進一步澄清,請問! –

1

作爲一個經驗法則,始終把調試點明白你們爲什麼越來越異常/錯誤。

這裏的問題是你的外循環從0運行到第1行。但是在內部循環中,您正在使用[row + 2]和[row + 3]和[row + 1]。現在,當外循環進入第2行迭代時,您將得到一個超出界限的異常。

可以在這裏發佈代碼,但如果你明白這一點,你應該能夠解決它。

(編輯):在評論中提問的例子。

假設您有一個尺寸爲10X10的二維數組A [] []。 現在如果當前循環處於A [4] [4]或(A [row] [col]): 左元素:A [4] [3]或(A [row] [col-1])/ /我們在同一行,但(列-1),因爲我們想要左邊的元素。 右上角的元素:A [3] [5]或((A [row-1] [col + 1])//這裏我們要去(4-1)行,因爲我們對上面的行感興趣, (A [row + 1] [col-1])...

現在連續兩個左下角的左下角:A [5] [3]元素將會是(A [row + 1] [col-1])和(A [row + 2] [col-2])

嘗試通過繪製二維數組並命名每個單元格A [i] [j]。

+0

@ 11thdimension,和k1133這有助於很多...現在我只有一個問題比較對角線我沒有問題下來,並在右邊(\),我只是無法讓它下去,並向左/) – UchiaSky

+0

如果我理解正確,給定一個元素,你想得到它的所有鄰居的價值(左,右,上,下,左上,右上...)? – k1133

+0

是的,這是正確的。 – UchiaSky