如何正确地在java中混洗2D数组?

时间:2015-12-11 11:30:55

标签: java arrays

我想在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 个答案:

答案 0 :(得分:1)

存在不同的问题

  1. 您不会随机播放数据。从数组数据this.data[index][j]中取一个随机值(可能是相同值的多倍)并将其存储在数组dataShuffle中。当您发现时,这会导致意外的重复行。
  2. 在随机选择的行(值索引)上,您将列中的列值交换两次。由于末尾只有两列,因此订单与以前相同。
  3. 如果你只想改变行的顺序并将值保持在同一列中,你可以这样做。

    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并交换数据[index]和数据[5]
    2. 的值
    3. 采用随机索引0 <= index < 4并交换数据[index]和数据[4]
    4. 的值
    5. 等......