タイトルが私が尋ねようとしていることを正しく示唆しているかどうかはわかりません. 以下のような 2 次元の int 配列があるとします。
int[][] x={{1,7,6},{2,4,8}};
ここで、最初の行を昇順にソートしたいのですが、2 行目のデータはソート後に同じ列にある必要があります。つまり、ソート後、配列は次のようになります。
x={{1,6,7},{2,8,4}}
それを行う正しい方法は何ですか?
これは、独自の並べ替えアルゴリズムを実装し、2行目の値を移動することで実行できます。
Obejctsの配列があるかもしれません。各オブジェクトは値を保持します。次に、カスタムコンパレータを実装し、並べ替え関数を使用します。
もう1つ考えがあります。配列を並べ替えます(可能な場合)。次に、ペアを1つのint[]テーブルに保持します。そして、外側のテーブルはintテーブルのconatinerです。
int [][] a = {{2,5},{1,4},{3,6}};
Arrays.sort(a, new Comparator<int[]>() {
@Override
public int compare(int[] p_o1, int[] p_o2) {
return Integer.valueOf(p_o1[0]).compareTo(p_o2[0]);
}
});
これは、独自のソート ルーチンを実装することで実行できますが、より良いアプローチはリファクタリングです。
データを数値のペアの配列としてカプセル化し、各ペアを独自のオブジェクトにラップしてみてください。次に、最初の値で並べ替えて、いずれかの値にアクセスできます。
class Pair<T extends Comparable<T>> implements Comparable<Pair<T>> {
final T a;
final T b;
public Pair ( T a, T b ) {
this.a = a;
this.b = b;
}
@Override
public int compareTo(Pair<T> o) {
// Comparison on 'a' only.
return a.compareTo(o.a);
}
@Override
public String toString () {
return "{" + a + "," + b + "}";
}
}
public static void main(String args[]) {
Pair[] pairs = {
new Pair(1,2),
new Pair(7,4),
new Pair(6,8),
};
System.out.println("Before: "+Arrays.toString(pairs));
Arrays.sort(pairs);
System.out.println("After: "+Arrays.toString(pairs));
}
版画
Before: [{1,2}, {7,4}, {6,8}]
After: [{1,2}, {6,8}, {7,4}]
簡単な方法はPair
、ペアを保持するオブジェクトを作成し、ペアの最初の項目のみを比較するカスタム コンパレータを使用してペアのコレクションを並べ替えることです。
必要に応じて、いつでもペアを 2D 配列に戻すことができます。
これはおそらく最も効率的な方法ではありませんが、ほとんどのユース ケースでは十分なはずです。
最初の行のすべての要素が一意で null でない場合は、並べ替える前に、最初の行の要素が 2 番目の行の対応する要素を指すマップを設定できます。最初の行を並べ替えた後、マップを使用して、最初の (並べ替えられた) 行に対応する 2 番目の行の要素を検索できます。
あなたは基本的に を行ってMap
いますが、実装を使用しMap
て支援してみませんか?
TreeMap
実装SortedMap
するため、簡単な解決策は、マップされたすべての値をその中に配置することです。
SortedMap<Integer, Integer> map = new TreeMap<Integer, Integer>();
map.put(1, 2);
map.put(7, 4);
map.put(6, 8);
// You can iterate over map now, it'll be already sorted
for(Map.Entry<Integer, Integer> entry: map.entrySet())
{
System.out.println(entry.getKey()+" : "+entry.getValue());
}
// This is not really necessary
Integer[][] x = {map.keySet().toArray(new Integer[0]), map.values().toArray(new Integer[0])};
// If you have Apache Commons you can:
int[][] y = {ArrayUtils.toPrimitive(map.keySet().toArray(new Integer[0])), ArrayUtils.toPrimitive(map.values().toArray(new Integer[0]))};