配列が
int [] a = {5, 4, 3, 2, 1}; int [] b = {3, 6, 2, 5, 4};
とある場合に
aとbにそれぞれ、関連性があり、
aの5とbの3には関連性があり、aの4とbの6には関連性がある、など、aの5,4,3,2,1の順番と、bの3,6,2,5,4の順番とがそれぞれ、ひもづいているイメージです。
そのとき、
aの5,4,3,2,1の順番をソートして
Arrays.sort(a)
としたときに
aの配列の番号(インデックス番号)の変化に合わせて、bのインデックス番号も変化させたい、という場合には、どういった方法が考えられるでしょうか?
よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
方法1
- 配列aを複製する(a2)
- a2をソートする
- a2の要素を先頭から順に取り、それがaの中で何番目か調べ、bの同じ番号を取り、配列を作る
java
1int [] a = {5, 4, 3, 2, 1}; 2int [] b = {3, 6, 2, 5, 4}; 3 4int[] a2 = Arrays.copy(a, a.length); 5Arrays.sort(a2); 6int[] b2 = new int[a.length]; 7for (int i == 0; i < a.length; i++) { 8 int index = -1; 9 for (int j = 0; j < a.length; j++) { 10 if (a[i] == a[j]) { 11 index = j; 12 break; 13 } 14 } 15 b2[i] = b[index]; 16}
方法2
aとbの要素をMapに対応付ける。キーでソートするためにTreeMapを使う。
このためsortなどのソートメソッドを呼ぶ必要がない。
java
1int [] a = {5, 4, 3, 2, 1}; 2int [] b = {3, 6, 2, 5, 4}; 3 4Map<Integer, Integer> map = new TreeMap<>(); 5for (int i = 0; i < a.length; i++) { 6 map.put(a[i], b[i]); 7}
投稿2018/09/20 19:49
総合スコア20649
0
2つの方法を示します。
1. index をソートする
2. [[5, 3], [4, 6], [3, 2], [2, 5], [1, 4] ]をソートする。
a[] に値の重複があった場合で試しています。
参考情報
- Get the indices of an array after sorting?
https://stackoverflow.com/questions/4859261/
java
1package teratail; 2 3import java.util.ArrayList; 4import java.util.Arrays; 5import java.util.Collections; 6import java.util.Comparator; 7 8public class A { 9 public static void main(String[] args) { 10 int[] a0 = { 5, 4, 3, 2, 1, 5}; 11 int[] b0 = { 3, 6, 2, 5, 4, 10}; 12 sortX(a0, b0); 13 show_array(a0, b0); 14 15 int[] a1 = { 5, 4, 3, 2, 1, 5 }; 16 int[] b1 = { 3, 6, 2, 5, 4, 10 }; 17 sortY(a1, b1); 18 show_array(a1, b1); 19 } 20 21 static void sortX(int a[], int b[]) { 22 ArrayList<Integer> index = new ArrayList<>(); 23 for (int i = 0; i < a.length; i++) { 24 index.add(i); 25 } 26 Collections.sort(index, new Comparator<Integer>() { 27 public int compare(Integer idx1, Integer idx2) { 28 return a[idx1] - a[idx2]; 29 } 30 }); 31 // System.out.println(index); 32 33 int[] work_a = a.clone(); 34 int[] work_b = b.clone(); 35 for (int i = 0; i < a.length; i++) { 36 int idx = index.get(i); 37 a[i] = work_a[idx]; 38 b[i] = work_b[idx]; 39 } 40 } 41 42 static void sortY(int a[], int b[]) { 43 int[][] ab = new int[a.length][2]; 44 for (int i = 0; i < a.length; i++) { 45 ab[i][0] = a[i]; 46 ab[i][1] = b[i]; 47 } 48 Arrays.sort(ab, (x, y) -> Integer.compare(x[0], y[0])); 49 50 for (int i = 0; i < a.length; i++) { 51 a[i] = ab[i][0]; 52 b[i] = ab[i][1]; 53 } 54 } 55 56 static void show_array(int a[], int b[]) { 57 System.out.println(Arrays.toString(a)); 58 System.out.println(Arrays.toString(b)); 59 System.out.println(); 60 } 61}
投稿2018/09/21 22:16
総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/23 10:42
2018/09/23 13:19
2018/09/23 13:41
2018/09/24 01:26
2018/09/24 01:31
2018/09/24 06:35
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/20 20:00 編集