2016-04-05 6 views
0

Я пытаюсь переупорядочить 2D-массив с помощью циклов. Первый метод generateSong() создает массив со случайными удвоениями и отлично работает. Тогда у меня есть метод simulateSong(). Его цель - взять строки из массива generateSong() и перепечатать их как столбцы, начиная с нижнего.Переупорядочение строк и столбцов 2D-массива

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

} 

Число строк и столбцов задается параметрами командной строки в основном методе.

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

} 

} 

Так, в конечном счете, что я пытаюсь сделать, это сделать так, чтобы строки изначально читать слева направо, теперь читаются как столбцы сверху вниз. Вот требуемый вывод с 3 строками и 4 столбцами, заданными как аргументы командной строки.

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 

И с кодом, который у меня в настоящее время есть, является результатом, который я получаю.

Guitar.simualateSong() 
3898.32 3898.32 3898.32 3898.32 
2356.74 2356.74 2356.74 2356.74 
2538.83 2538.83 2538.83 2538.83 

Я знаю, что единственная проблема (проблемы) лежат в цикле for метода simulateSong(). Как вы видите, мой результат близок, но нет сигары.

+1

Это '0' звучит как ошибка здесь: song [i] [j] = song [i] [0]; –

+0

Я знаю, что 0 не должен туда идти, но он как можно ближе к самому себе, поэтому я написал – seventeenhundred

+0

Спасибо за ответы. Теперь он работает правильно. – seventeenhundred

ответ

1

, если я понимаю, вы правы это должно быть что-то вроде этого ...

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 делает что-то вроде

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

simulateSong делает что-то вроде

А1 В1 С1
А2 В2 С2
А3 В3 С3
A4 B4 C4

0

Есть две проблемы в вашей функции. Прежде всего, если я правильно понял, вы не хотите менять свой массив каким-либо образом, вы просто хотите напечатать его по столбцу.

Хотя, в функции есть такая строка:

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

Который явно заставляет вас изменить массив. Если вы хотите изменить свой массив, это не так, как вы собираетесь уничтожить некоторые значения, которые вам понадобятся позже, вставив новый. Плюс, вы указываете «0» как второй индекс измерения, что означает, что вы в основном копируете только одну строку. Если вы не хотите менять свой массив, то просто удалите эту строку, я не вижу, как это поможет для вас.

Вторая проблема заключается в этой строке:

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

Покидая его, как это прямо сейчас (и удаление другой линии), вы бы напечатать массив от конца к попрошайничеству, но вы не захотели печать по столбцу. В ордере для этого вам нужно только отменить «i» и «j».

Что привело бы к этой функции:

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

Вы можете увидеть во внутреннем цикле вашего метода simulateSong ...

for(int j = song[i].length-1; j >= 0; j--) { 
     song[i][j] = song[i][0]; 
     System.out.printf(" %.2f",song[i][j]); 
    } 

Мы устанавливаем текущее значение песни [I] [j] - значение [i] [0]. Значение 0 никогда не меняется, поэтому все, что вы здесь делаете, устанавливает каждое значение песни для первого значения песни (при этом 0 является первым значением в песне i).

Таким образом, логика явно неверна. Некоторые указатели для вас, чтобы работать на:

  • Если вы переводите строки и столбцы, то вам нужно переключить индексы, то есть значение [я] [J] должно стать значение [J] [я], не [i] [0]
  • Вам потребуется временная переменная для хранения значений, когда вы переключаете свои значения. Например. вы хотите, чтобы [i] [j] сохранил значение [j] [i], и наоборот, вам нужно сохранить одно из этих значений в temp, чтобы затем вы могли заменить это значение, а затем переместить его на значение, которое вы только что изменили в переменном темпе (как он будет переписан в настоящее время во 2-е переменного, см псевдокода ниже)

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

Надеется, что это помогает.

Смежные вопросы