繁体   English   中英

重新排序2D阵列的行和列

[英]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中的第一个值)。

因此,逻辑显然是错误的。 一些需要您指导的指针:

  • 如果要切换行和列,则需要切换索引,即value [i] [j]应该变成value [j] [i],而不是[i] [0]
  • 在切换值时,您将需要一个临时变量来存储值。 例如,您想让[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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM