2017-04-25 1 views
0

Hallo ich zu fragen, wie man ein Array wickelnJava Array Wrap Around

zum Beispiel nimmt das Array unter:

|00 01 02 03 04 05 06 07| 

sagen, ich wollte alles richtig bewegen, um diese zu erhalten:

|07 00 01 02 03 04 05 06| 

Wie mache ich das, ohne irgendwelche Daten zu verlieren?

, um die Dinge nach rechts zu bewegen i zur Zeit diesen Code verwendet:

public void transform(IFrame frame) { 

    char tempImage; 

    for (int i = 0; i < frame.getNumRows(); i++) { 
     for (int j = 0; j < frame.getNumRows(); j++) { 

      tempImage = frame.getChar(i,j); 

      frame.setChar(i+1, j, tempImage); 
} 

im Wesentlichen, was ich der Code will in sehr grundlegenden Begriffen zu tun ist:

  • durch jede Zeile/Kasse column (die frame.getNumRows, da der Rahmen quadratisch ist, sind die Zeilen/Spalten gleich

  • erhalten Sie den char-Wert von i und j aus dem Rahmen

-mit diesem Rahmen, stellen den Rahmen char Wert von i und j i + 1 zu sein, während j gleich bleibt

-mit dem Zeichensatz werden die Bildtemperatur sein

UPDATE

ich diese Methode implementiert haben und verändert sie sich von der vorherigen geschrieben, unten ist die aktualisierte Code:

public void transform(IFrame frame) { 

     char constantImage; 

     for (int i = 0; i < frame.getNumRows(); i++) { //go through each row/column 
      for (int j = 0; j < frame.getNumRows(); j++) { 

       constantImage = frame.getChar(i, j); 

       TransformFrames.add(constantImage); 

       Collections.rotate(Arrays.asList(TransformFrames), 1); 


       for (Character f : TransformFrames) { 
        frame.setChar(i, j, f); 
       } 
      } 
     } 
    } 

TransformFrames ist eine Zeichen-Array-Liste.

Durch Debugging kann ich sehen, dass die richtigen Daten der Array-Liste hinzugefügt werden, und ich hoffe, verschoben werden, aber ich bin nicht in der Lage, dies zu sehen, wie die GUI nicht aktualisiert, sobald diese Methode aufgerufen wird - irgendwelche Vorschläge warum oder wie zu reparieren ??

Dank

+0

Während Sie dies sicherlich mit einem Array tun können, würde ich eine 'ArrayList' empfehlen. Um das alles zu "wickeln", müssen Sie nur das letzte Element entfernen und dann an den Anfang "hinzufügen". –

Antwort

0

glaube ich, ist eine bekannte Lösung dieses:

Sie

haben
|00 01 02 03 04 05 06 07| 

Fügen Sie die gleiche Array wieder an das Ende:

|00 01 02 03 04 05 06 07 00 01 02 03 04 05 06 07| 

Jetzt Das Array um den Index i ist nur das Sub-Array dieses neuen Arrays im Index i und die gleiche Länge wie Ihre erste Array mit:

01 02 03 04 05 06 07 00 

02 03 04 05 06 07 00 01 

03 04 05 06 07 00 01 02 

etc

+0

Wie würde so etwas um den obigen Code herum implementiert werden? –

2

Eine einfache Möglichkeit ist Collections.rotate:

Collections.rotate(Arrays.asList(array), 1); 
+0

Beachten Sie, dass Grundelemente mit dieser Methode nicht verwendet werden können; Ihre Box-Wrapper-Klassen sind erforderlich. –

+0

Übrigens, ich liebe deinen Adventure-Avatar! –

0

Zunächst einmal ist dies wahrscheinlich ein „XY Problem". Sie haben ein Problem zu lösen, das Sie uns nichts über Sie gesagt haben, Denken Sie was Sie tun müssen, um Ihr Problem zu lösen ist ein Array rotieren, (ja, rotierende ist der Begriff dafür verwendet) und Sie fragen uns, wie man ein Array dreht. (Siehe: http://xyproblem.info) Mit anderen Worten, Sie bitten uns, ein "X" -Problem zu lösen, während Sie eigentlich ein "Y" -Problem lösen möchten, das vor ihm lag, also wäre es für alle Beteiligten von Vorteil gewesen Erzähl uns stattdessen von dem "Y" -Problem. Aber lass uns mit der Frage weitermachen.

Das Problem der Elemente zu überschreiben, die Sie mit einer bekannten Lösung ein wohlbekanntes Problem, bewegen wollen, ist:

  • Wenn Sie nach links drehen möchten, kopieren Sie Elemente von links nach rechts das heißt aufsteigend.

  • Wenn Sie nach rechts drehen möchten, kopieren Sie Elemente von rechts nach links, also absteigend.

Das ist alles, was es ist.

Und dann natürlich, in Java gibt es System.arrayCopy(), die das für Sie tun, ohne dass Sie das Rad neu erfinden müssen.