質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

19880閲覧

【Java】二次元配列のソート方法

USBmause

総合スコア16

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2017/06/13 01:35

編集2017/06/13 01:42

int[][] intArray = {{1,2},{6,5},{3,2}{4,1}};
例えばこういった二次元配列があったとして、
{{1,2},{3,2},{4,1},{6,5}}
このように、intArray[i][0]をソートして昇順に並び替えたいです。
下記のようにArrays.sortを使用したらエラーになりましたが、
使用できるのでしょうか。

public class TestArraysort { public static void main(String[] args){ int [][] in = {{1,2},{4,5},{2,9}}; Arrays.sort(in); System.out.println(in); } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tkturbo

2017/06/13 01:39

使用したらエラーになった、ご自分で書いたソースコードを記載していただけませんか?
guest

回答3

0

ベストアンサー

int[][]は二次元配列ですね。それに適用できるArrays#sortメソッドは概ね以下の2種類(Comparatorを指定しないものとするもの)になります。

(1-1) static void sort(Object[] a)
(1-2) static <T extends Comparable<? super T>> void parallelSort(T[] a)
指定されたオブジェクト配列を、その要素の自然順序付けに従って昇順にソートします。

(2-1) static <T> void sort(T[] a, Comparator<? super T> cmp)
(2-2) static <T> void parallelSort(T[] a, Comparator<? super T> cmp)
指定されたコンパレータが示す順序に従って、指定されたオブジェクトの配列をソートします。

intを要素とするsortもありますがそれは一次元に限ります。二次元の配列はこう考えます。

int[][]は「int[]を要素とする一次元配列」「int[]はintではなく配列。配列はプリミティブ型ではなくて参照型の一種なので前述のどちらかにしか適用できない。

さて、T(本ケースではT=int[])は自然順序付けができるなら(1-*)が適用できます。一般に参照型であれば

class X implements Comparable<X>

のように「このクラスは比較できますよ」という定義になっているものに対して「自然順序付けされている」と考えるとよいと思います。ここでT(=int[])は自然順序付けされていません。intの配列の大小をどのように決めるかはJavaでは「決まっていない」からです。
parallelSortの方(1-2)は「ComparableであるようなTを指定することが強制される」ので、比較できない型を指定していることにコンパイル時に気づけますが(1-1)を使うと実行してみないと気づけないという落とし穴があります

(2)を使えば「比較順序を明示できる」ので以下のようにしてソートできます。

java

1int[][] array = new int[][] { { 1, 2}, .... }; 2Arrays.sort(array, (a, b) -> Integer.compare(a[0], b[0]));

投稿2017/06/13 01:51

編集2017/06/13 02:47
KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

swordone

2017/06/13 01:59

parallelSortって初めて知った。わざわざStream化しなくても並列処理できるんですね。
USBmause

2017/06/13 02:11

このコードで並び替えができました。ありがとうございます。
KSwordOfHaste

2017/06/13 02:19

あ・・・コピペ間違えてsortではなくparallelSortの方を挙げてしまいました。 単なるsortメソッドでもできますよ。>質問者さん。
KSwordOfHaste

2017/06/13 02:21

並列処理できるんですが、自分ではそもそも使ったことがないです。>swordoneさん。 Arraysソートでそれほど複雑なソートをする場面が思い浮かびませんし、並列処理が必要なほどの巨大な配列を普段使わないので・・・なんだか非常に特殊な場合しか使われない気がします。
KSwordOfHaste

2017/06/13 02:28

とりあえずsortが基本だと思うのでメソッド名をsortに書き換え、parallelSortもある点を補う形で回答を書き換えました。
swordone

2017/06/13 02:31

ただ今度は自然順序付けのsortってジェネリクス宣言されてないんですよね…
KSwordOfHaste

2017/06/13 02:50 編集

あ・・・コメントありがとうございます。 あわてて直すとろくなことがないですね・・・ --- 回答を編集し、sort(Object[] array)の方はジェネリックとなっていないのでコンパイル時に気づけない点を追記いたしました。ジェネリクスがサポートされていない当時から存在していたメソッドはこういうところで変なインターフェースになってますが、後方互換を重視するのがJavaなので仕方がないですね・・・
guest

0

Arrays.sort(Object[])は、対象となる配列の各要素がComparableを実装して相互に比較可能でなければなりません。今渡しているのはint[]の配列であり、int[]にComparableはないため比較できません。
そのため、int[]同士を比較するComparatorを作成し、Arrays.sort(T[], Comparator<? super T>)を使用する必要があります。

java

1Arrays.sort(in, new Comparator<int[]>(){ 2 @Override 3 public int compare(int[] o1, int[] o2) { 4 return Integer.compare(o1[0], o2[0]); 5 } 6});

投稿2017/06/13 01:50

swordone

総合スコア20649

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自分でそういったメソッドを書いてみるのが良いと思います。

java

1public int[][] sort(int[][] array){ 2 // 3}

投稿2017/06/13 01:43

otftrough

総合スコア476

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問