2016-04-05 25 views
0

Ich versuche, ein 2D-Array mit for-Schleifen neu anzuordnen. Die erste generateSong() -Methode erstellt das Array mit zufälligen Doppelungen und funktioniert gut. Dann habe ich die simulateSong() Methode. Sein Zweck besteht darin, die Zeilen aus dem Array generateSong() zu übernehmen und sie als Spalten neu zu drucken, beginnend mit dem unteren.Neuordnen von 2D-Array-Zeilen und -Spalten

import java.util.concurrent.ThreadLocalRandom; 

public class Guitar { 

private int strings; 
private int chords; 

private double[][] song; 

public Guitar(int mstrings, int mchords) { 
    this.strings = mstrings; 
    this.chords = mchords; 
    song = new double[mstrings][mchords]; 
} 

public void generateSong() { 
    for (int i = 0; i < song.length; i++) { 
     for (int j = 0; j < song[i].length; j++) { 
      song[i][j] = ThreadLocalRandom.current().nextDouble(27.5, 4186); 
      System.out.printf(" %.2f",song[i][j]); 
     } 
     System.out.println(); 
    } 
} 

public void simulateSong() throws InterruptedException { 
    System.out.println("\nGuitar.simualateSong() "); 
    for(int i = song.length-1; i >= 0; i--) { 
     for(int j = song[i].length-1; j >= 0; j--) { 
      song[i][j] = song[i][0]; 
      System.out.printf(" %.2f",song[i][j]); 
     } 
     System.out.println(); 
    } 
} 

} 

Die Anzahl der Zeilen und Spalten wird durch Befehlszeilenargumente in der Hauptmethode festgelegt.

public class Songwriter { 

public static void main(String[] args) throws InterruptedException { 

    System.out.println("Guitar(): Generated new guitar with " + args[0] + " strings. Song length is " + args[1] + " chords."); 

    String args0 = args[0]; 
    int strings = Integer.parseInt(args0); 
    String args1 = args[1]; 
    int chords = Integer.parseInt(args1); 

    Guitar guitarObj1 = new Guitar(strings, chords); 
    guitarObj1.generateSong(); 
    guitarObj1.simulateSong(); 

} 

} 

Also letztendlich, was ich versuche, es zu tun ist, so dass die Reihen nach rechts sind jetzt als Spalten von oben nach unten zu lesen lesen ursprünglich links. Hier ist die beabsichtigte Ausgabe mit 3 Zeilen und 4 Spalten, die als Befehlszeilenargumente definiert sind.

Guitar(): Generated new guitar with 3 strings. Song length is 4 chords. 
2538.83 2269.30 1128.09 3419.77 
2356.74 2530.88 2466.83 3025.77 
3898.32 3804.22 3613.94 337.93 

Guitar.simualateSong() 
3898.32 2356.74 2538.83 
3804.22 2530.88 2269.30 
3613.94 2466.83 1128.09 
    337.93 3025.77 3419.77 

Und mit dem Code, den ich derzeit habe, ist dies die Ausgabe, die ich bekomme.

Ich weiß, dass das einzige Problem (s) in den for-Schleifen der Methode simulateSong() liegt. Wie Sie sehen können, ist meine Leistung knapp, aber keine Zigarre.

+1

Diese '0' klingt hier wie ein Fehler: song [i] [j] = song [i] [0]; –

+0

Ich weiß, dass die 0 nicht dorthin gehen sollte, aber es ist so nah, wie ich es alleine geschafft habe, also habe ich es geschrieben – seventeenhundred

+0

Danke für die Antworten. Es funktioniert jetzt korrekt. – seventeenhundred

Antwort

1

wenn ich verstehe, dass Sie sich es so etwas wie dies sein sollte ...

public void simulateSong() { 
    System.out.println("\nGuitar.simualateSong() "); 
    for (int i = 0; i < chords; i++) { 
     for (int j = 0; j < strings; j++) { 
      System.out.printf(" %.2f", song[j][i]); 
     } 
     System.out.println(); 
    } 
} 

generateSong macht so etwas wie

A1 A2 A3 A4
B1 B2 B3 B4
C1 C2 C3 C4

simulateSong macht so etwas wie

A1 B1 C1
A2 B2 C2
A3 B3 C3
A4 B4 C4

0

Es gibt zwei Probleme in Ihrer Funktion. Zuallererst, wenn ich richtig verstanden habe, willst du dein Array nicht auf irgendeine Weise ändern, du willst es nur spaltenweise drucken.

Obwohl es in Ihrer Funktion ist diese Zeile:

song[i][j] = song[i][0]; 

die deutlich macht Sie Ihren Array ändern. Wenn Sie Ihr Array ändern wollten, dann ist das nicht der richtige Weg, da Sie einige Werte zerstören werden, die Sie später benötigen, indem Sie das neue einfügen. Außerdem geben Sie "0" als Index der zweiten Dimension an, was bedeutet, dass Sie grundsätzlich nur eine Zeile kopieren werden. Wenn Sie Ihr Array nicht ändern möchten, dann löschen Sie einfach diese Zeile, ich sehe nicht, wie es Ihnen helfen würde, es zu tun.

Das zweite Problem ist in dieser Zeile:

System.out.printf(" %.2f",song[i][j]); 

es verlassen, wie es jetzt ist (und das Löschen der anderen Linie) würden Sie Ihr Array vom Ende zum Betteln drucken, aber sie würde nicht Druck für Spalte. Um dies zu tun, müssen Sie nur "i" und "j" umkehren.

, die zu dieser Funktion führen würde:

public void simulateSong() { 
    System.out.println("\nGuitar.simualateSong() "); 
    for (int i = 0; i < chords; i++) { 
     for (int j = 0; j < strings; j++) { 
      System.out.printf(" %.2f", song[j][i]); 
     } 
     System.out.println(); 
    } 
} 
0

Sie in der inneren Schleife Ihrer simulateSong Methode ...

for(int j = song[i].length-1; j >= 0; j--) { 
     song[i][j] = song[i][0]; 
     System.out.printf(" %.2f",song[i][j]); 
    } 
den aktuellen Song Wert sehen kann [i] Wir setzen

[j] ist der Wert [i] [0]. Der 0-Wert verändert sich nie. Sie setzen also jeden Wert des Songs auf den ersten Wert des Songs (wobei 0 der erste Wert in Song i ist).

Also ist die Logik eindeutig falsch. Einige Hinweise für Sie arbeiten:

  • Wenn Sie die Zeilen und Spalten sind Schalen dann müssen Sie die Indizes wechseln, dh Wert [i] [j] sollte Wert werden [j] [i], nicht [i] [0]
  • Sie müssen eine temporäre Variable haben, um Werte zu speichern, wenn Sie Ihre Werte wechseln. Z.B. Sie möchten, dass [i] [j] den Wert von [j] [i] speichert, und umgekehrt, Sie müssen einen dieser Werte in temp speichern, damit Sie diesen Wert dann ersetzen und dann verschieben können der Wert, den Sie nur in der temporären Variable geändert wird (wie es jetzt in der 2. Variable überschrieben werden, finden Sie Pseudo-Code unten)

    temp = row[i][j] 
    row[i][j] = row[j][i] 
    row[j][i] = temp 
    

Hoffnung, das hilft.

Verwandte Themen