【问题标题】:Make a permutation of a 2d array in Java在 Java 中对二维数组进行排列
【发布时间】:2017-04-05 10:56:30
【问题描述】:

我有一个二维矩阵:

double[][] data = new data[1000][1000];

和一维数组:

int[] ID_list;

我要新建一个矩阵:

double[][] new_data;

使用 ID_list 进行索引:new_data[1] => data[ID_list[1]], new_data[2] => data[ID_list[2]], ...

如何在 Java 中以最有效的方式做到这一点?

【问题讨论】:

    标签: java matrix


    【解决方案1】:

    如果想法是基于ID_list 中的索引存储重新组织data。迭代这个数组。

    double[][] new_data = new double[ID_list.length][];
    for(int i = 0; i < ID_list.length; ++i){
        new_data[i] = data[ID_list[i]];
    }
    

    这只会复制数组的引用,而不是值本身,因此不会使内存使用量翻倍。

    注意:我使用 ID_list 长度来初始化数组,如果你只需要一些列会更好。

    编辑:

    这里有一个例子来说明二维数组只是一个数组的数组。

    int[][] original = {
        {1,2,3},
        {4,5,6}
    };
    
    int[][] copy = new int[1][];
    copy[0] = original[0];
    
    System.out.println(original[0]);
    System.out.println(copy[0]);
    
    System.out.println(Arrays.toString(original[0]));
    System.out.println(Arrays.toString(copy[0]));
    original[0][1] = 7;
    System.out.println(Arrays.toString(original[0]));
    System.out.println(Arrays.toString(copy[0]));
    

    会输出

    [I@3941a79c //change on each run
    [I@3941a79c
    [1, 2, 3] //original[0]
    [1, 2, 3] //copy[0]
    [1, 7, 3] //original[0] after the update
    [1, 7, 3] //copy[0]
    

    这是关于 Arrays member 的 JSL。这可能会很有趣。

    【讨论】:

    • 您能否提供文档链接以证实答案?我不完全相信这种方法只会复制数组的引用:(
    • @DangManhTruong 好吧,你可以从这里开始。 How is a two-dimensional array represented in memory in java?。二维数组只是一维数组的参考。很容易检查,更新初始数组中的一个单元格,查看新数组中的对应值(基于排序)。会更新的。
    • 但不是说数组不会被值复制? :(
    • @DangManhTruong 那你没看帖子也没写小测试代码。请参阅我添加的代码。如果这还不够,我帮不了你……
    • 谢谢,代码很有帮助。在您提供的链接中,有这样一行:“多维数组的克隆是浅的,也就是说它只创建一个新数组。子数组是共享的。”。所以我想这是真的:P
    猜你喜欢
    • 2021-07-14
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-17
    • 2017-05-25
    相关资源
    最近更新 更多