2013-03-16 102 views
13

SO,的java Arrays.sort 2D陣列

我looknig基於的值以下數組進行排序[] [0]

double[][] myArr = new double[mySize][2]; 

所以爲前,myArr,該內容是:

1  5 
13  1.55 
12  100.6 
12.1 .85 

我希望它去:

1  5 
12  100.6 
12.1 .85 
13  1.55 

我正在尋找這樣做,而不必執行我自己的排序。任何幫助表示讚賞,謝謝。

+1

使用「比較器」。 – 2013-03-16 17:38:10

回答

32

使用重載Arrays#Sort(T[] a, Comparator c)它將比較器作爲第二個參數。

double[][] array= { 
{1, 5}, 
{13, 1.55}, 
{12, 100.6}, 
{12.1, .85} }; 

java.util.Arrays.sort(array, new java.util.Comparator<double[]>() { 
    public int compare(double[] a, double[] b) { 
     return Double.compare(a[0], b[0]); 
    } 
}); 
+3

這種減法可能不會奏效;你應該使用'Double.compare(b [0],a [0])'代替。 – 2013-03-16 17:41:08

+0

@LouisWasserman啊,真的,編輯它謝謝:) – PermGenError 2013-03-16 17:43:10

+2

如何排序期望一維數組時,你如何傳遞二維數組作爲參數?這對我不起作用。 – user2441441 2013-12-20 15:44:06

6

你需要實現一個Comparator<Double[]>像這樣:

public static void main(String[] args) throws IOException { 
    final Double[][] doubles = new Double[][]{{5.0, 4.0}, {1.0, 1.0}, {4.0, 6.0}}; 
    final Comparator<Double[]> arrayComparator = new Comparator<Double[]>() { 
     @Override 
     public int compare(Double[] o1, Double[] o2) { 
      return o1[0].compareTo(o2[0]); 
     } 
    }; 
    Arrays.sort(doubles, arrayComparator); 
    for (final Double[] arr : doubles) { 
     System.out.println(Arrays.toString(arr)); 
    } 
} 

輸出:

[1.0, 1.0] 
[4.0, 6.0] 
[5.0, 4.0] 
-1

對於您可以使用Column Comparator的通用解決方案。使用類的代碼是:

Arrays.sort(myArr, new ColumnComparator(0)); 
0
import java.util.*; 

public class Arrays2 
{ 
    public static void main(String[] args) 
    { 
     int small, row = 0, col = 0, z; 
     int[][] array = new int[5][5]; 

     Random rand = new Random(); 
     for(int i = 0; i < array.length; i++) 
     { 
      for(int j = 0; j < array[i].length; j++) 
      { 
       array[i][j] = rand.nextInt(100); 
       System.out.print(array[i][j] + " "); 
      } 
      System.out.println(); 
     } 

     System.out.println("\n"); 


     for(int k = 0; k < array.length; k++) 
     { 
      for(int p = 0; p < array[k].length; p++) 
      { 
       small = array[k][p]; 
       for(int i = k; i < array.length; i++) 
       { 
        if(i == k) 
         z = p + 1; 
        else 
         z = 0; 
        for(;z < array[i].length; z++) 
        { 
         if(array[i][z] <= small) 
         { 
          small = array[i][z]; 
          row = i; 
          col = z; 
         } 
        } 
       } 
      array[row][col] = array[k][p]; 
      array[k][p] = small; 
      System.out.print(array[k][p] + " "); 
      } 
      System.out.println(); 
     } 
    } 
} 

好運

2

雖然這是一個古老的線程,這裏有兩個例子在Java8解決問題。

由第一列進行排序([] [0]):

double[][] myArr = new double[mySize][2]; 
// ... 
java.util.Arrays.sort(myArr, java.util.Comparator.comparingDouble(a -> a[0])); 

由前兩列排序([] [0],[] [1]):

double[][] myArr = new double[mySize][2]; 
// ... 
java.util.Arrays.sort(myArr, java.util.Comparator.<double[]>comparingDouble(a -> a[0]).thenComparingDouble(a -> a[1])); 
11

歡迎使用Java 8:

Arrays.sort(myArr, (a, b) -> Double.compare(a[0], b[0]));