【问题标题】:Sorting 3 dimensional array in Java在Java中对3维数组进行排序
【发布时间】:2016-06-25 19:36:37
【问题描述】:

我有一个由矩阵组成的三维 int 数组(立方体)。我的问题是,我想创建一个新的 3 维数组,我将在其中使用插入排序按最高值对矩阵进行排序。我不想在新多维数据集中保存值,但我想保存只保存矩阵的数量。这是一些例子,我想怎么做。希望你能理解我的想法:

int[][] matrix1={{10,50,10},{3,5,1},{100,500,800}};
int[][] matrix2={{30,30,30},{3,3,3},{300,300,300}};
int[][] matrix3={{20,20,20},{2,2,2},{200,200,200}};
int[][][] nonSortedMatrices={matrix1,matrix2,matrix3};

现在我想这样排序:

int[][] matrixWithHighestValue={{2,1,2},{2(or 1),1,2},{2,1,1}};
int[][] matrixSecHighestValue={{3,2,3},{1(or2),2,3},{3,2,2}};
int[][] matrixWithLowestValue={{1,3,1},{3,3,1},{1,3,3}};
int[][][] sortedMatrices={matrixWithHighestValue,matrixSecHighestValue,matrixWithLowestValue};

就是这样。希望很清楚。矩阵matrixWithHighestValue 将在每个地方包含三个(在这种情况下)矩阵中每个地方的最佳选择,我正在考虑如何做几个小时,但我无法解决这个问题。只认为我要使用的是插入排序,因为它是最快的方式,因为数据不是那么大。 我会非常感谢每一个建议。

【问题讨论】:

  • 当你说“只有矩阵的数量”时,你想要索引,对吧?
  • 按照您描述的方式,听起来 sortedMatrices 实际上应该只是一维整数数组。就像如果你发现 matrix2 > matrix1 > matrix3 你会想要:`int[] sortedIndices = {2, 1, 3]'。
  • 是的,你是对的。我想这样写是因为我觉得这样更容易理解
  • 不,我不想对矩阵进行排序。我想在每个地方保存最好的项目
  • 所以每个地方都会有所不同,所以它必须是新的 3d 数组

标签: java arrays sorting matrix multidimensional-array


【解决方案1】:

注意:这假设所有矩阵都具有相同的维度。

我很难想出一种简单的方法来将 (10, 30, 20) 排序为 (最高, 次高, 最低) 或 (2, 3, 1) 的索引顺序,但是这个内部类 + 辅助方法方法似乎很好地做到了这一点。

main方法扫描未排序的矩阵,同时构建排序的矩阵。

public class MatrixSorter {

    static class IntPos {
        public int num, pos;

        IntPos(int num, int pos) {
            this.num = num;
            this.pos = pos;
        }

        @Override
        public String toString() {
            // For testing purposes to use Arrays.toString
            return String.valueOf(pos + 1);
        }
    }

    private static int[] getSortedPositions(int[] nums) {
        IntPos[] positions = new IntPos[nums.length];

        for (int i = 0; i < nums.length; i++) {
            positions[i] = new IntPos(nums[i], i);
        }

        Arrays.sort(positions, new Comparator<IntPos>() {
            @Override
            public int compare(IntPos o1, IntPos o2) {
                return -1 * Integer.compare(o1.num, o2.num);
            }
        });

        int[] sortedPos = new int[nums.length];
        for (int i = 0; i < nums.length; i++) {
            sortedPos[i] = positions[i].pos + 1;
        }

        return sortedPos;
    }

    public static void main(String[] args) {
        int[][] matrix1 = {{10, 50, 10}, {3, 5, 1}, {100, 500, 800}};
        int[][] matrix2 = {{30, 30, 30}, {3, 3, 3}, {300, 300, 300}};
        int[][] matrix3 = {{20, 20, 20}, {2, 2, 2}, {200, 200, 200}};
        int[][][] nonSortedMatrices = {matrix1, matrix2, matrix3};

        final int MATRIX_SIZE = nonSortedMatrices.length;
        int[][][] sortedMatrices = new int[MATRIX_SIZE][MATRIX_SIZE][MATRIX_SIZE];

        for (int r = 0; r < MATRIX_SIZE; r++) {
            for (int c = 0; c < MATRIX_SIZE; c++) {

                int[] nums = new int[MATRIX_SIZE];
                for (int d = 0; d < MATRIX_SIZE; d++) {
                    nums[d] = nonSortedMatrices[d][r][c];
                }
                int[] sortedPos = getSortedPositions(nums);

                for (int d = 0; d < MATRIX_SIZE; d++) {
                    sortedMatrices[d][r][c] = sortedPos[d];
                }
            }
        }
    }
}

打印出排序后的矩阵是这样的

for (int r = 0; r < MATRIX_SIZE; r++) {
    for (int c = 0; c < MATRIX_SIZE; c++) {
        System.out.print(Arrays.toString(sortedMatrices[r][c]) + " ");
    }
    System.out.println();
}

在没有单独的 int[][] 值的情况下输出您在问题中想要的内容。

[2, 1, 2] [1, 1, 2] [2, 1, 1] 
[3, 2, 3] [2, 2, 3] [3, 2, 2] 
[1, 3, 1] [3, 3, 1] [1, 3, 3] 

【讨论】:

  • 非常感谢,但是对于我的问题来说太慢了。我不想使用集合,因为它们用于加速非常糟糕。无论如何,我对您的想法有相同的想法,但我希望有某种方法可以解决我所说的问题。感谢您的帮助
  • 我使用集合的唯一原因是因为我不知道如何使用自定义比较器对数组进行排序。 ArrayList 在内部使用了一个数组,所以我不明白这个问题。
  • @Prone66 如果你想坚持使用数组,我已经更新了getSortedPositions 方法。
  • 感谢您的帮助。干得好伙计。明天一定要看看,现在如果我能在键盘上看到我很高兴:))
猜你喜欢
  • 2021-07-14
  • 2013-05-26
  • 2012-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多