2013-01-23 169 views
1

我有一個二維數組來整理使用Java。排列整個2D陣列

我看過使用比較器的各種鏈接 How to sort a two-dimension ArrayList

但它總是排序在一個特定的元素。我想能夠排序整個二維數組。 對於例如,

int[][] r = {{1,7,5},{1,3,5},{1,3,6}, {2,3,1}}; 

上排序應該給我

{1,2,3},{1,3,5},{1,3,6},{1,5,7}. 

謝謝!

回答

2

這將滿足您的需求:

Arrays.sort(array, new Comparator<int[]>() { 
    @Override 
    public int compare(int[] o1, int[] o2) { 
     Arrays.sort(o1); 
     Arrays.sort(o2); 
     for (int i = 0; i < o1.length && i < o2.length; i++) { 
      if (o1[i] != o2[i]) { 
       return o1[i] < o2[i] ? -1 : 1; 
      } 
     } 
     if (o1.length != o2.length) { 
      return o1.length < o2.length ? -1 : 1; 
     } 
     return 0; 
    } 
}); 
+0

感謝您的幫助!這是非常感謝:) –

+0

這是最緊湊的版本 –

3

你需要的是一個自定義比較器,它允許根據你的標準比較兩個整數列表。

在使用此比較器進行排序之前,您必須首先對列表進行排序。

+0

'公共靜態無效sortArray(整數myarray的[] []){ Arrays.sort(myarray的新的比較(){ @Override 公共 int compare [Integer [] o1,Integer [] o2) { return o1 [0] .compareTo(o2 [0]); } }); }' 在這裏我可以比較基於特定列的數組說,但我如何比較整個數組並獲得所需的結果?謝謝 –

+0

(回覆舊版本的帖子)'''Integer.valueOf(o1.hashCode())''''''''一個數組的hashCode通常是通過System.identityHashCode從內存中的指針派生出來的,與內容做。這是行不通的,而拳擊只是讓你可以使用.compareTo()不是一種非常有效的做事方式。 –

+0

忘記哈希碼的想法與拳擊它不起作用...,首先排序子元素,然後根,這是我的消息的想法。 –

3

這是我會做它在Java中:

private static void sortArray(int[][] array) { 
    // Perform initial sorting 
    for (int[] subArray : array) { 
     Arrays.sort(subArray); 
    } 

    // Sort each array by its contents (similar to string sorting) 
    Arrays.sort(array, new Comparator<int[]>() { 
     @Override 
     public int compare(int[] o1, int[] o2) { 
      int length = Math.min(o1.length, o2.length); 
      for (int i = 0; i < length; i++) { 
       if (o1[i] > o2[i]) return 1; 
       if (o1[i] < o2[i]) return -1; 
      } 

      // Longer arrays come after shorter arrays, but only if the rest is equal 
      if (o1.length > o2.length) return 1; 
      if (o1.length < o2.length) return -1; 

      return 0; 
     } 
    }); 
} 

第一步排序所有數組的二維數組裏面,然後整個陣列是基於每個陣列內的內容進行排序2D陣列。比較器的工作原理與您可能期望的區分大小寫的字符串比較器類似。

+0

這工作就像一個魅力。非常感謝! –

+0

注意java.lang.ArrayIndexOutOfBoundsException here: 'for(int i = 0; i o2 [i])return 1; (o1 [i]

+0

好抓到了,我現在就修好了 –