[英]Reordering 2D array rows and columns
我正在尝试使用for循环对2D数组重新排序。 第一个generateSong()方法创建带有随机双精度数的数组,并且可以正常工作。 然后,我有SimulateSong()方法。 其目的是从generateSong()数组中获取行,并将它们重新打印为列,从底部开始。
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();
}
}
}
行数和列数由main方法中的命令行参数设置。
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
我知道唯一的问题就在于SimulateSong()方法的for循环。 如您所见,我的输出接近,但没有雪茄。
如果我正确理解你的话,应该是这样的...
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
模拟歌曲使类似
A1 B1 C1
A2 B2 C2
A3 B3 C3
A4 B4 C4
您的功能有两个问题。 首先,如果我已正确理解,您不想以任何方式更改数组,而只想逐列打印。
但是,在您的函数中有以下行:
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();
}
}
您可以在您的SimulationSong方法的内循环中看到...
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中的第一个值)。
因此,逻辑显然是错误的。 一些需要您指导的指针:
在切换值时,您将需要一个临时变量来存储值。 例如,您想让[i] [j]存储[j] [i]的值,反之亦然,则需要将这些值之一存储在temp中,因此您可以替换该值,然后将其移动到您刚刚在temp变量中更改的值(因为现在将在第二个变量中将其覆盖,请参见下面的伪代码)
temp = row[i][j] row[i][j] = row[j][i] row[j][i] = temp
希望这可以帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.