重新排序2D数组行和列

时间:2016-04-05 08:42:57

标签: java arrays

我试图用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循环。你可以看到我的输出很接近,但没有雪茄。

3 个答案:

答案 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],而不是[i] [0]
  • 您需要有一个临时变量来存储切换值时的值。例如。你想让[i] [j]存储[j] [i]的值,反之亦然,你需要在temp中存储其中一个值,这样你就可以替换那个值,然后将其移动到您刚刚在temp变量中更改的值(因为它现在将在第二个变量中被覆盖,请参阅下面的伪代码)

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

希望这有帮助。

相关问题