繁体   English   中英

如何正确改组Java中的2D数组?

[英]How to shuffling the 2D array in java correctly?

我想在Java中将2D数组改组,该数组的数据:

2.5 2.6 
2.0 3.0 
3.0 3.0 

这是我的随机播放方法:

public void shuffleData(){
        Random rnd = new Random();
        double temp[][] = new double[this.NBaris][NKolom];
        this.dataShuffle = new double[this.NBaris][NKolom];;

        for(int i = this.NBaris-1; i >= 0; i--){
            int index = rnd.nextInt(i + 1);
            for(int j = 0; j < this.NKolom; j++){
                temp[0][j] = this.data[index][j];
                this.dataShuffle[index][j] = this.dataShuffle[i][j];
                this.dataShuffle[i][j] = temp[0][j];
            }
        }

    }

但是结果是当我打印时变成这样:

2.5 2.6 
2.5 2.6 
2.0 3.0

我的方法有什么问题?,您能帮我吗? 谢谢。

有不同的问题

  1. 您不会洗牌。 您从数组数据this.data[index][j]获取一个随机值(可能是同一值的几倍),并将其存储在数组dataShuffle中。 您会发现,这导致了意外的重复行。
  2. 在随机选择的行(值索引)上,您两次交换列中的列值。 由于最后只有两列,因此顺序与之前相同。

如果您只想调整行的顺序并将值始终保留在同一列中,则可以这样。

double[][] data = {{1.1, 1.2}, {2.1, 2.2}, {3.1, 3.2}};
List<double[]> asList = Arrays.asList(data);
Collections.shuffle(asList);
data = asList.toArray(new double[0][0]);
System.out.println("toArray = " + Arrays.deepToString(data));

样本输出

toArray = [[1.1, 1.2], [3.1, 3.2], [2.1, 2.2]]

如果您不想只混排行,也不想混排列之间的值,则可以使用此代码段

double[][] data = {{1.1, 1.2}, {2.1, 2.2}, {3.1, 3.2}};
Random random = new Random();
int numberOfValues = data.length * data[0].length;
for (int i = numberOfValues - 1; i > 0; i--) {
    int index = random.nextInt(i);
    int row = i / data[0].length;
    int column = i - row * data[0].length;
    int randomRow = index / data[0].length;
    int randomColumn = index - randomRow * data[0].length;
    double temp = data[row][column];
    data[row][column] = data[randomRow][randomColumn];
    data[randomRow][randomColumn] = temp;
}
System.out.println("toArray = " + Arrays.deepToString(data));

样本输出

toArray = [[2.1, 3.2], [2.2, 1.2], [1.1, 3.1]]

这个想法是将所有条目视为一个平面数组[2.1, 3.2, 2.2, 1.2, 1.1, 3.1]并从最后一个索引开始回到第二个索引。

  1. 取随机索引0 <= index < 5并交换data [index]和data [5]上的值
  2. 取随机索引0 <= index < 4并交换data [index]和data [4]上的值
  3. 等等 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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