2016-05-10 7 views
0

私は区間[g] [2]と呼ばれる2次元配列を持っています。 現在、最初の要素の順序を上げることで配列をソートしようとしています。等しい場合は、2番目の要素で降順に並べ替えます。Javaコンパイラを使用して2次元配列をソートする

私は2つの方法でこれをしようとしました:

Arrays.sort(interval, Comparator.comparing((int[] arr) -> arr[0])); 

2)は、Arrays.sortを使用して::

Arrays.sort(interval, new Comparator<int[]>() { 
    @Override 
    public int compare(int[] s1, int[] s2) { 
     if (s1[0] > s2[0]) 
      return 1; 
     else if (s1[0] < s2[0]) 
      return -1; 
     else { 
      if(s1[1] < s2[1]) 
       return 1; 
      else if (s1[1] > s2[1]) 
       return -1; 
      else 
       return 0; 
     } 
    } 
}); 
のJava 8のComparator.comparing方法を使用して

1)

最初のメソッドは、部分的にソートされたリストを返します。

[[0, 10], [10, 30], [30, 50]] 
[[0, 10], [3, 19], [35, 45]] 
[[10, 30], [27, 33], [30, 50]] 
[[-10, 10], [0, 20], [35, 45]] 
[[10, 30], [20, 40], [30, 50]] 
[[0, 20], [8, 28], [37, 43]] 
[[0, 20], [15, 35], [37, 43]] 
[[0, 0], [8, 28], [10, 40]] 

ご覧のとおり、3つのタプルのセットでソートされています。

2番目の方法では、配列をまったく並べ替えません。プリミティブデータ型を使用してソートすることはできませんか?誰も助言することはできますか?

+2

あなたが表示された出力を生成何?コードを表示します。 3Dアレイのように見えます。 –

+2

g = 3の2次元配列をソートする8つの異なる例のようです。それらは3組の最初の値によって完全にソートされたように見えます。どのペアも位置1に同じ値を持たないので、セカンダリソートが動作するかどうかはどのように分かりますか? – Andreas

+0

@ジムガリソン私は入力に応じてgを設定していましたが、正しいですが、次の入力セットではgを更新することはなかったことに気付きました。私は自分のコードを修正し、以下の答えを試してみるとうまくいくようです。ありがとうございました! – viviboox3

答えて

2

私はあなたがこのために探していると思う:

Arrays.sort(interval, Comparator.comparingInt((int[] arr) -> arr[0]).thenComparing(Comparator.comparingInt((int[] arr) -> arr[1]).reversed())); 

それとも、カスタムComparatorと一緒に行きたい場合:

Arrays.sort(interval, new Comparator<int[]>() { 
    @Override 
    public int compare(int[] o1, int[] o2) { 
     int result = Integer.compare(o1[0], o2[0]); 
     if (result == 0) { 
      result = Integer.compare(o2[1], o1[1]); 
     } 
     return result; 
    } 
}); 
+0

非常に良い。 Op#2はうまくいきますが、私はあなたの短いバージョン*が好きです(もちろん私は同じ回答を投稿しようとしていました)。 – Andreas

1
int[][] interval = new int[][] { {0, 10}, {10, 30}, {30, 50}, {0, 10}, {3, 19}, {35, 45}, {10, 30}, {27, 33}, {30, 50}, {-10, 10}, {0, 20}, {35, 45}, {10, 30}, {20, 40}, {30, 50}, {0, 20}, {8, 28}, {37, 43}, {0, 20}, {15, 35}, {37, 43}, {0, 0}, {8, 28}, {10, 40} }; 

Arrays.sort(interval, Comparator.<int[]>comparingInt(arr -> arr[0]).thenComparing(arr -> arr[1], Comparator.<Integer>naturalOrder().reversed())); 

Stream.of(interval).forEachOrdered(ints -> System.out.println(Arrays.toString(ints))); 
関連する問題