- ベストアンサー
多次元配列のソート
過去に同様の質問があったのですが、未回答でしたので質問させていただきます。 多次元配列のうちの一つの列の値でソートし、その他の列にも結果を連動させたいのですが方法が分かりません。 たとえば、a[n][m]という配列で a[0][0]=C a[0][1]=う a[0][0]=A a[0][1]=あ a[1][0]=A a[1][1]=あ → a[1][0]=B a[1][1]=い a[2][0]=B a[2][1]=い a[2][0]=C a[2][1]=う というように、n列でソートしm列でもその結果で並べ替えたいです。 恐らくComparatorインタフェースを使用すると可能かと思うのですが、方法を教えて頂けないでしょうか。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
wo-007さん、こんにちは。 Comparatorインタフェースまで気づいていらっしゃるだけに惜しいですね。そのインタフェースの実装の仕方さえわかれば、あとqazwsxeさんの回答にもあるArraysクラスのsortメソッドを使えば簡単にソートができます。 いかにサンプルを示します。 public class MultiArraySortTest { public static void main(String[] args) { // String配列の配列を用意します。 String[][] testArray = new String[][] { {"B", "1"}, {"A", "2"}, {"C", "3"}, {"A", "4"} }; // 各String配列をソートします。 Arrays.sort(testArray, new StringArrayComparator()); // ソート結果を表示します。 for ( int i = 0; i < testArray.length; i++ ) { for ( int j = 0; j < testArray[i].length; j++ ) { System.out.print( "[" + testArray[i][j] + "]" ); } System.out.println(); } } } /** * String配列を比較するクラス。<br> */ class StringArrayComparator implements Comparator { /** * 渡されたオブジェクトを比較します。<br> * このメソッドでは、2つの引数ともString配列であることを期待し、 * キャストした上、compare(array1, array2)を呼び出します。<br> * よって、どちらかがString配列ではない場合、ClassCastExceptionをスローします。 * @param o1 比較するString配列オブジェクトその1。 * @param o2 比較するString配列オブジェクトその2。 * @return o1がo2より小さい場合は負の値を、 * o1がo2と等しい場合は0を、 * o1がo2より大きい場合は正の値を、戻します。 * @throws ClassCastException o1、o2いずれかがString配列ではない場合。 * @see #compare(String[], String[]) */ public int compare(Object o1, Object o2) { int returnVaule = 0; returnVaule = compare((String[])o1, (String[])o2); return returnVaule; } /** * 渡されたString配列を比較します。<br> * 引数で渡されたString配列の0番目要素(先頭要素)を比較し、 * その結果をそのまま戻します。 * @param array1 比較するString配列オブジェクトその1。 * @param array2 比較するString配列オブジェクトその2。 * @return array1がarray2より小さい場合は負の値を、 * array1がarray2と等しい場合は0を、 * array1がarray2より大きい場合は正の値を、戻します。 */ public int compare(String[] array1, String[] array2) { int returnVaule = 0; returnVaule = array1[0].compareTo(array2[0]); return returnVaule; } } 本来のこのように答えを書くのはいけないのかもしれませんが、今回の質問はAPIに対する知識の差だけですので、あえて書きました。あとはこの内容を応用して、昇順ではなく降順にも対応するにはどうすればよいか、0番目以外の要素でソートするにはどうすればよいか、X番目、Y番目の組み合わせでソートするにはどうすればよいか、など応用した方法を考えていただければと思います。
その他の回答 (2)
- qazwsxe
- ベストアンサー率20% (2/10)
他にいくらでも方法はあると思いますけど 一応、目的は達成できます。 import java.util.*; public class Hairetu { public static void main(String[] args) { char arr[][] = {{'C' ,'う'} ,{'A' ,'あ'} ,{'B' ,'い'}}; // 表示 for(int i = 0; i < arr.length ;i++){ for(int l = 0; l < arr[i].length ;l++){ System.out.print(" " + arr[i][l]); } System.out.println(); } char arr2[] = new char[arr.length]; for(int i = 0; i < arr.length ; i++){ arr2[i] = arr[i][0]; } // 並び替え Arrays.sort(arr2); System.out.println("--------------"); // 表示 for(int i = 0; i < arr2.length ;i++){ char ch = arr2[i]; for(int l = 0; l < arr.length ; l++){ if(ch == arr[l][0]){ System.out.println(arr[l][0] + " " + arr[l][1]); } } } } }
お礼
サンプルを載せていただき、ありがとうございます。 参考にさせていただきます。
- ngsvx
- ベストアンサー率49% (157/315)
レコードのソートですね。 通常レコードソートは、1つのレコードを1つのオブジェクトに格納し、それをソートします。 もし、どうしても多次元配列を使いたいということなのであれば、 1.ソートロジックを自分で作る 2.キーとレコード番号の組み合わせのクラスを定義・生成し、それをソートする。 データを取り出す場合は、ソートされたレコード番号を参照する。 という方法しかありません。 *わかりにくい箇所があれば、補足します
お礼
>1つのオブジェクトに格納 多次元配列しか思いつかなかったのですが、具体的にはどのようなオブジェクトなのでしょうか。
お礼
ご丁寧にありがとうございます。 完璧です! じっくり読んで勉強させていただきます。