2016-03-10 107 views
1

我有三維int數組(矩陣)由矩陣組成。我的問題是,我想創建一個新的三維數組,我將通過插入排序按最高值對矩陣進行排序。我不想在新立方體中保存數值,但我只想節省矩陣的數字。下面是一些例子,我想怎麼做。希望你能理解我的想法:在Java中排序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將在每個地方包含三個(在這種情況下)矩陣的每個地方的最佳選擇,我想如何做幾個小時,我不能解決這個問題。只想到我想使用的是插入排序,因爲它是最快的方式,因爲數據不是那麼大。 我會非常感謝每一個建議。

+0

當你說「只有矩陣的數量」,你想索引,對吧? –

+0

你描述它的方式,聽起來像sortedMatrices應該只是一個1d的整數數組。就像如果你發現matrix2> matrix1> matrix3,你會想:'int [] sortedIndices = {2,1,3]'。 – tyler

+0

是的,你說得對。我想這樣寫,因爲我認爲它更容易理解 – Prone66

回答

0

注意:這假定所有的矩陣具有相同的尺寸。

我在思考一種簡單化的方法(10,30,20)將其排序爲(最高,次高,最低)或(2,3,1)的索引順序時很困難,但是這個內部類+輔助方法似乎做得很好。

主要方法掃描未排序矩陣並同時構建排序矩陣。

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] 
+0

非常感謝,但對我的問題來說太慢了。我不想使用集合,因爲它們加速非常糟糕。無論如何,我有同樣的想法你有什麼,但我希望有某種方式如何解決它我如何說。感謝您的幫助 – Prone66

+0

我使用集合的唯一原因是因爲我不知道如何使用自定義比較器對數組進行排序。 ArrayList在內部使用一個Array,所以我不理解這個問題。 –

+0

@ Prone66然而,如果你想堅持使用數組,我已經更新了'getSortedPositions'方法。 –