2017-05-18 53 views
1

我有一個if語句看起來像這樣:Java的變化長期if語句轉化爲循環

   if (pan[x + 1][y + 1].getBackground() == TeamColor && 
         pan[x + 1][y].getBackground() == TeamColor && 
         pan[x + 1][y -1].getBackground() == TeamColor && 
         pan[x][y - 1].getBackground() == TeamColor && 
         pan[x - 1][y - 1].getBackground() == TeamColor && 
         pan[x - 1][y].getBackground() == TeamColor && 
         pan[x - 1][y + 1].getBackground() == TeamColor && 
         pan[x][y + 1].getBackground() == TeamColor) { 

         // do something 
       } 

目的是檢查每個項目(在一個二維數組)的當前x和y的值周圍,使確定它們是正確的顏色。

我假設有一個簡單的方法來做到這一點。我會假設創建一個for循環可以通過遍歷每個項目來解決問題,但不幸的是無法想到這樣做的方式,因爲項目並非全部按順序排列。

注:我發現了計算器許多其他職位,其中名爲「解決方案很長的if語句,」不幸的是,他們在不同的編程語言(如Python,Android和JavaScript)的

注2:這是不是this後的副本。這是一個字符串和正則表達式的問題,不幸的是不是我的問題的解決方案

希望有人會有一個答案!

回答

3

嘗試是這樣的:

boolean match = true; 
for (int dx = -1; match && (dx < 2); ++dx) { 
    for (int dy = -1; match && (dy < 2); ++dy) { 
     if (dx != 0 || dy != 0) { 
      match = pan[x+dx][y+dy].getBackground() == TeamColour; 
     } 
    } 
} 
if (match) { 
    // do something 
} 

基本上,你要檢查的偏移-1,在每個方向0和1,所以我們有兩個for循環,每生產這些偏移在一個維度。然後檢查每個偏移量對應的數組元素,並使用match變量進行跟蹤。

但請注意,與原始代碼一樣,這將在邊界附近失敗(例如,如果x == 0)。這可以在必要時修復。

當然,可以讓循環遍歷實際索引來檢查(例如for (int x2 = x-1; x2 < x+2; ++x))。最後它是一樣的。

+0

@Mac - 是的,我想避免檢查pan [x] [y],只檢查周圍的元素。 – JFreeman

+0

@JFreeman:相應地修正。 – Mac

+0

至於我使用簡單的嘗試語句 – JFreeman

1
for (int a = x-1;a <= x+1;a++) 
{ 
    if (a < 0 || a >= pan.length) continue; 
    for (int b = y-1; b <= y+1; b++) 
    { 
     if (b < 0 || b >= pan[a].length) continue; 
     if (a == x && b == y) continue; 
     if (pan[a][b].getBackground() != TeamColor) 
      return false; 
    } 
} 
return true; 
1

我可以提出兩種方法:

1)全部對象的方式

您可以引入自定義類Coordinate把兩個值:X和Y座標。
創建一個列表Coordinate您可以在其中找到要測試的座標元素並對其進行迭代以實現您的需要。

public class Coordinate{ 

    private final int x; 
    private final int y; 

    public Coordinate(int x, int y){ 
    this.x = x; 
    this.y = y; 
    } 

    public getX(){ 
    return x; 
    } 

    public getY(){ 
    return y; 
    } 
} 

而且你可以使用它:

List<Coordinate> coordinates = new ArrayList<>(); 

coordinates.add(new Coordinate(1,1)); 
coordinates.add(new Coordinate(1,0)); 
coordinates.add(new Coordinate(1,-1)); 
coordinates.add(new Coordinate(0,-1)); 
coordinates.add(new Coordinate(-1,-1)); 
coordinates.add(new Coordinate(-1,0)); 
coordinates.add(new Coordinate(-1,1)); 
coordinates.add(new Coordinate(0,1)); 

// you can also init them with a loop  

boolean isMatched = true; 
for (Coordinate coordinate : coordinates){ 
    if (pan[x + coordinate.getX()][y + coordinate.getY()].getBackground() != TeamColor){ 
     isMatched = false; 
     break; 
    } 
} 

對象的辦法是更冗長,但它的優勢在於揭露的規則。
因此,您可以輕鬆閱讀並更改它。
假設檢查規則變得更加複雜,它變得非常有價值。

2)較短的編碼方式

這是相同的,甚至通過內聯座標的值,並通過忽略你不希望測試(沒有變化的情況下)的特定情況下的邏輯。

boolean isMatched = true; 
for (int xDelta = -1; xDelta <=1; xDelta++){ 
    for (int yDelta = -1; yDelta <=1; yDelta++){ 
     // as you don't want to test if no change 
     if (yDelta == 0 && xDelta ==0){ 
      continue; 
     } 
     if (pan[x + xDelta][y + yDelta ].getBackground() != TeamColor){ 
     isMatched = false; 
     break; 
     } 
} 
+1

謝謝!我喜歡選項1)它非常清楚。 (我認爲第7行有錯誤,應該說是-1,-1) – JFreeman

+0

謝謝。確實。 – davidxxx