2017-11-25 2 views
1

Ich möchte meine Arraylist senden:Arraylist Array senden zu überprüfen, ob Puzzle auflösbar ist

ArrayList<Tile> myList = new ArrayList<Tile>(); 

, dass nach:

public void shuffleBoard() { 
    Collections.shuffle(myList); 

    for (int i = 0; i < SIZE; i++) { 

    } 

    switch (SIZE) { 

    case 0: 
     moveEmptyTile(Direction.UP); 

    case 1: 
     moveEmptyTile(Direction.DOWN); 

    case 2: 
     moveEmptyTile(Direction.LEFT); 

    case 3: 
     moveEmptyTile(Direction.RIGHT); 
    } 

sieht wie folgt aus:

[[ 05 ], [ 12 ], [ ** ], [ 08 ], [ 02 ], [ 03 ], [ 01 ], [ 10 ], [ 04 ], [ 11 ], [ 07 ], [ 15 ], [ 13 ], [ 09 ], [ 06 ], [ 14 ]] 

Das I möchte an ein Array senden, damit ich prüfen kann, ob die Karte mit diesem Code lösbar ist:

public static boolean isSolvable(int[] state){ 

    //prepare the mapping from each tile to its position 
    int[] positions = new int[16]; 
    for(int i = 0; i < state.length; i++){ 
     positions[state[i]] = (i+1)%16; 
    } 

    //check whether this is an even or odd state 
    int row = (positions[0]-1)/4; 
    int col = (positions[0]-1)-row*4; 
    boolean isEvenState = positions[0] == 0 || row % 2 == col %2; 

    //count the even cycles 
    int evenCount = 0; 
    boolean[] visited = new boolean[16]; 
    for(int i = 0; i < positions.length; i++){ 
     if(visited[i]) 
      continue; 
     //a new cycle starts at i. Count its length.. 
     int cycleLength = 0; 
     int nextTile = i; 
     while(!visited[nextTile]){ 
      cycleLength++; 
      visited[nextTile] = true; 
      nextTile = positions[nextTile]; 
     } 
     if(cycleLength % 2 == 0) 
      evenCount++; 
    } 
    return isEvenState == (evenCount % 2 == 0); 

Deshalb möchte ich meine Arraylist zu einem Array konvertieren, und zurück, dass als int[] state-isSolvable(int[] state) so kann man erkennen, ob mein Puzzle auflösbar ist.

Es ist wahrscheinlich etwas dumm einfach, aber mein Kopf ist Gelee nach dem Versuch dieses Forum für eine Lösung zu suchen.

My Tile-Klasse:

public class Tile { 
private int value; 
private static int maxValue = 15; 
private static int minValue = 0; 


public Tile(int value) { 
    setValue(value); 

} 

public int getValue() { 
    return value; 
} 

public void setValue(int value) { 
    if (value <= maxValue) 
     this.value = value; 
    else if (value > maxValue) 
     System.err.print("To high"); 
} 

public boolean isEmpty() { 
    if (getValue() == minValue) { 
     return true; 
    } else { 
     return false; 
    } 
} 

@Override 
public String toString() { 
    if (this.isEmpty() == true) { 
     return "[ ** ]"; 
    } 
    if (this.value < 10) { 
     return "[ 0" + value + " ]"; 
    } 
    else { 
     return "[ " + value + " ]"; 
    } 
} 

}

Mit freundlichen Grüßen.

+0

Wie kann ein 'Tile' (was immer das ist) in ein' int' umgewandelt werden? – Seelenvirtuose

+0

Das 'Tile' ist ein' int', das an einen 'toString' gesendet wurde. Wenn ich wie oben beschrieben nicht kann, dann muss ich einfach etwas von meinem Code wiederholen und ein 'Array' anstelle eines' Arraylist' verwenden, so viel wie ich es bekomme. –

+0

Nein. Ein 'Tile' ist ein' Tile' und ein 'int' ist ein' int'. Ein 'Tile' ist möglicherweise eine Klasse, die Sie selbst deklariert haben. Diese Erklärung ist ein wichtiger Teil deiner Frage, also zeige diesen Code auch! – Seelenvirtuose

Antwort

1

Der allgemeine Ansatz ist es, eine int Array mit einer Schleife aufzubauen, während jede Tile in eine int Umwandlung (Ich denke, möchten Sie das value Feld extrahieren):

int size = myList.size(); 
int[] values = new int[size]; 
for (int i = 0; i < size; i++) { 
    values[i] = myList.get(i).getValue(); 
} 

Jetzt können Sie Ihre Methode aufrufen, wie einfach:

boolean solveable = isSolvable(values); 

Mit Java 8 (und später) können Sie den Array erstellen Code mit Hilfe von Streams vereinfachen können:

int[] values = myList.stream().mapToInt(Tile::getValue).toArray(); 
+0

Das hat mir sehr geholfen. Danke noch einmal. –

Verwandte Themen