2016-04-29 9 views
1

ich zur Zeit folgenden Code hat:Compact Weise zu prüfen, ob Array bestimmtes Element enthält

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() 
     } 
    } 

Natürlich ist dieser Code nicht kompilieren. Ich suche nach einer schicken und kompakten Art zu überprüfen, wann (x, y) in der gegebenen Liste sind. Ich kann dies mit 4 if-Anweisungen oder einer Schleife tun, aber das ist kein richtiger Weg imo. Ich suche nach etwas, das dies in konstanter Zeit tut.

EDIT:

Ich glaube, ich einen Weg gefunden. Was denkst du über dies?

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(); 
      } 
     } 
    } 

Antwort

3

Heres Pseudo-Code für Arrays:

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 

Aber es gibt einen besseren Weg, wenn Sie wollen einfach nur überprüfen, ob sie in der Reihe sind. Erstellen Objekt Pair mit variabler x und y, erstellen equals() und hashCode() Funktionen für jedes Paar einzigartig haben (wie erhalten hashCode von string xy), legen Sie alle Eingaben in Set und dann prüfen, ob gegeben Pair(x,y) in Set ist.

+0

In der Tat. Dies erfordert jedoch eine Schleife innerhalb von Set.contains (...) selbst. Ich dachte an etwas in konstanter Zeit. Ich habe ein neues Stück Code hinzugefügt, das konstante Zeit benötigt. – Domien

+1

Set enthält Werke in O (1), also gibt es keine Schleifen. Nur Schleife ist für Einfügen, aber Sie tun es bereits, wenn Sie Daten im Array platzieren, wenn Sie es nicht fest codierten. –

+0

Ah ich muss die Komplexität übersehen haben. Du hast Recht. – 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

fügen Sie einfach Pause hinzu; in if (Arrays.equals (coord, someXYArray)), so dass es nicht weitergeht, wenn Sie eine Übereinstimmung haben. –

2

Ich habe eine alternative Lösung für Ihre Frage. Ausgehend von deinem Code gehe ich davon aus, dass du etwas schachbezogen schreibst und deine Liste legalForBlack eine Reihe von Koordinaten ist, zu denen der Spieler wechseln darf. Der beste Weg IMO wäre, jedes Quadrat auf der Tafel mit einem Index (0 bis maximal 63) zu kodieren und alle davon in einer Map vom Typ < Integer, Coordinate > zu speichern, wobei Coordinate int x und int y hat. Wenn Sie für die Koordinaten keine besondere Verwendung haben, können Sie Ihre Map auch überspringen und in ein einfaches Array erlaubter Quadrate konvertieren. Dazu müssten Sie lediglich überprüfen, ob ein bestimmter Wert in Ihrer Liste zulässiger Felder enthalten ist. Ich hoffe, das gibt Ihnen einen besseren Ansatz für Ihr Problem. Viel Glück!

Verwandte Themen