2016-04-29 47 views
1

我目前有以下代碼:緊湊的方式,如果數組包含特定元素

int[][] legalForBlack = {{0,1},{1,0},{2,3},{3,2}}; 
    for (int x=0;x<boardSize;x++) { 
     for (int y=0;y<boardSize;y++) { 
      if (x,y) in legalForBlack 
       methodA() 
      else 
       methodB() 
     } 
    } 

當然,這代碼不能編譯。我正在尋找一種花哨而緊湊的方式來檢查(x,y)何時位於給定列表中。 我可以用4個if語句或一個循環來做到這一點,但這不是一種正確的方法。 我正在尋找在恆定時間內完成此操作的內容。

編輯:

我想我找到了一種方法。你覺得這怎麼樣?

int[][] legalForBlack = {{0,1},{1,0},{2,3},{3,2}}; // keep in order! 
    int cur = 0; 
    for (int x=0;x<boardSize;x++) { 
     for (int y=0;y<boardSize;y++) { 
      int[] buffer = legalForBlack[cur]; 
      if (x==buffer[0] && y==buffer[1]) { 
       cur++; 
       methodA(); 
      } else { 
       methodB(); 
      } 
     } 
    } 

回答

3

繼承人僞數組:

input data in array 
find x with for to match first column (legalForBlack[i][0]) 
    if x matches legalForBlack[i][0] check if legalForBlack[i][1] matches y 
    if yes, count it 

但是還有一個更好的方法,當你只是要檢查,如果他們在陣。創建具有可變xy對象Pair,創建equals()hashCode()功能,對每對獨特的(像得到string xyhashCode),把所有的投入在Set,然後檢查是否給出Pair(x,y)Set

+0

確實。但是這將需要Set.contains(...)本身內的一個循環。 我在不斷的思考着什麼。 我添加了一段需要時間不變的新代碼。 – Domien

+1

Set包含O(1)中的作品,所以沒有循環。只有循環用於插入,但如果未對數據進行硬編碼,則在將數據放入數組時,您已經這樣做了。 –

+0

啊我一定忽視了複雜性。你是對的。 – Domien

2
boolean isLegal = false; 
for(int[] coord: legalForBlack) 
    if(Arrays.equals(coord, someXYArray)) { 
     isLegal = true; 
     break; //Credit to Adnan Isajbegovic 
    } 
if(isLegal) 
    methodA(); 
else 
    methodB(); 
+1

只需添加打破;在if(Arrays.equals(coord,someXYArray))中,所以當你有匹配時它不會繼續。 –

2

我有你的問題的替代解決方案。從你的代碼判斷,我認爲你正在寫一些與國際象棋有關的東西,你的法律黑名單列表是允許玩家移動到的一系列座標。 IMO最好的方法是使用索引(0到最大值63)對板上的每個方塊進行編碼,並將所有這些存儲在類型爲< Integer的座標圖中,座標爲>,其中座標爲int x和int y。如果您對座標沒有特別的用處,您也可以跳過並將您的地圖轉換爲允許方塊的簡單數組。這隻需要您檢查給定值是否在您的允許方列表中。我希望這給你一個更好的方法來解決你的問題。祝你好運!

相關問題