5

(ソートされていない) 配列があるとします。

[ 12 64 35 ]
[ 95 89 95 ]
[ 32 54 09 ]
[ 87 56 12 ]

2 番目の列が昇順になるように並べ替えます。

[ 32 54 09 ]
[ 87 56 12 ]
[ 12 64 35 ]
[ 95 89 95 ]

これに対処するために私が考えた方法は次のとおりです。

  1. 各 [ xyz ] 値をリストにし、各 xyz 値を識別子と関連付けます。この識別子のプロパティは xyz 値の y 値です。次に、識別子を並べ替えます。(Java配列をソートしても対応する値がその行に保持されるかどうかはわかりません)

  2. ハッシュマップを使用して、前と同じことを行います

ただし、上記の2つの方法は、不要な外部識別子の値に依存しているため、明らかにやや無駄が多く複雑です。これを行うためのより簡単で高速でエレガントな方法はありますか?

これがばかげた質問であれば申し訳ありませんが、私は Java が配列をソートする方法にまったく慣れていません。

4

4 に答える 4

8

最も簡単で最もクリーンな方法は、小さなコンパレータ クラスを作成することです。これにより、並べ替えの動作をより柔軟に制御できます。たとえば、最初の要素または配列の任意の要素を並べ替えることができます。

コンパレータは次のようになります。

new Comparator(){

            public int compare ( Integer[] obj1, Integer[] obj2)
            {
                return obj1[1].compareTo(obj2[1]); 
            }
于 2013-01-05T19:11:22.413 に答える
6

Arrays.sort()これはワンライナーです (無名クラスを 1 行と数えた場合) Comparator

Arrays.sort(grid, new Comparator<int[]>() {
    public int compare(int[] o1, int[] o2) {
        return o1[1] - o2[1];
    }
});

単純な比較式に注意してください。アンボックスして使用するo1[1] - o2[1]必要はありません。IntegerInteger.compareTo()

データを使用したテストは次のとおりです。

public static void main(String[] args) {
    int[][] grid = new int[][] { 
        { 12, 64, 35 },
        { 95, 89, 95 },
        { 32, 54,  9 },
        { 87, 56, 12 }};
    Arrays.sort(grid, new Comparator<int[]>() {
        public int compare(int[] o1, int[] o2) {
            return o1[1] - o2[1];
        }
    });
    System.out.println(Arrays.deepToString(grid).replace("],", "],\n"));
}

出力:

[[32, 54, 9],
 [87, 56, 12],
 [12, 64, 35],
 [95, 89, 95]]



楽しみのために、ここでは文字通り 1 行にしています。

Arrays.sort(grid, new Comparator<int[]>() {public int compare(int[] o1, int[] o2) {return o1[1] - o2[1];}});
于 2013-01-05T19:24:50.723 に答える
2

カスタム コンパレータを使用します。

Comparableこの実装は、任意の型および任意の並べ替えインデックスに使用できるという点で、より一般的です。型自体のカスタム コンパレーターも必要な場合は、Tそれをコンストラクターに渡し、.compareTo()呼び出しを置き換える必要があります。

public class ArrayElementComparator<T implements Comparable<? super T>> implements Comparator<T[]> {

    private final int sortIndex;

    public ArrayElementComparator(int sortIndex) {
        this.sortIndex = sortIndex;
    }

    @Override
    public int compare(T[] left, T[] right) {
        // Optional: null checks and boundary checks
        if (left == null && right == null) {
            return 0;
        }
        if (left == null || left.length <= sortIndex) {
            return 1;
        }
        if (right == null || right.length <= sortIndex) {
            return -1;
        }
        return left[sortIndex].compareTo(right[sortIndex]);
    }

}

使用法:

List<Integer[]> list = new List<Integer[]>();
// ... Add records
Collections.sort(list, new ArrayElementComparator<Integer>(1));
于 2013-01-05T19:23:01.247 に答える
1

これら 3 つの値が 3D ユークリッド空間の (x、y、z) 座標を表す場合、それらを保持するクラスを作成できます。次に、これらのポイントのリストまたは配列と顧客コンパレーターを使用して、希望する方法で並べ替えます。

于 2013-01-05T19:15:00.700 に答える