我试图用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循环。你可以看到我的输出很接近,但没有雪茄。
答案 0 :(得分: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就像是
A1 B1 C1
A2 B2 C2
A3 B3 C3
A4 B4 C4
答案 1 :(得分:0)
您的功能有两个问题。首先,如果我已经正确理解你不想以任何方式改变你的数组,你只想逐列打印它。
虽然,在你的函数中有这一行:
not found: type StreamingContext
这显然会让你改变阵列。如果您想要更改阵列,那么这不是正确的方法,因为您要在以后通过插入新值来销毁某些值。 另外,您指出&#34; 0&#34;作为第二维索引,这意味着您基本上只会复制一行。 如果您不想更改阵列,那么只需删除此行,我就不知道它对您有什么帮助。
第二个问题在于这一行:
song[i][j] = song[i][0];
将它保留为现在(并删除另一行),您将从最后打印到乞讨,但您不会按列打印。在这样做你只需要反转&#34;我&#34;和&#34; j&#34;。
这将导致此功能:
System.out.printf(" %.2f",song[i][j]);
答案 2 :(得分: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中的第一个值)。
所以逻辑显然是错误的。您可以使用的一些指示:
您需要有一个临时变量来存储切换值时的值。例如。你想让[i] [j]存储[j] [i]的值,反之亦然,你需要在temp中存储其中一个值,这样你就可以替换那个值,然后将其移动到您刚刚在temp变量中更改的值(因为它现在将在第二个变量中被覆盖,请参阅下面的伪代码)
temp = row[i][j]
row[i][j] = row[j][i]
row[j][i] = temp
希望这有帮助。