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

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

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

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

Q&A

解決済

2回答

2904閲覧

複数の配列があるときに配列の番号の変化を連動させたい

renji

総合スコア41

Java

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

2グッド

1クリップ

投稿2018/09/20 19:09

配列が

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のインデックス番号も変化させたい、という場合には、どういった方法が考えられるでしょうか?
よろしくお願いします。

d_96a, bracket_i👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

方法1

  1. 配列aを複製する(a2)
  2. a2をソートする
  3. 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

swordone

総合スコア20649

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

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

renji

2018/09/20 20:00 編集

ありがとうございました! 一番目にswordone様が書かれたプログラムを考えていたのですが、難しくて、自分ではなかなかイメージできませんでした。 二番目のTreeMapのほうはすごく短いプログラムで、キーで自動的にソートされるというのがすごく勉強になりました! HashMapしか使ったことがなかったのですが、これからはTreeMapも使っていきたいと思いました。 教えてくださってありがとうございました!
guest

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

katoy

総合スコア22324

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

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

renji

2018/09/22 21:43

ありがとうございました! プログラムのすべてを書いてくださったので、とても勉強になりました! 私のレベルだとCollections.sortのあとの内容が関数みたいで難しかったり、cloneを初めて見て驚いたりしておりますが、検索しながら、プログラムの流れを把握させて貰いました! ちょっとずつ、Javaの命令方法の知識が増えていって、楽しいです! 詳しいプログラムを教えてくださって、ありがとうございました!
katoy

2018/09/23 10:42

> ... プログラムのすべてを書いてくださったので ... 本来は 質問文に実行できるプログラムのすべてが記載されていて、回答では差分だけを書けばよいというのが良いと思っています。 katoy のプログラムでは、 a に 5 が2つある例で試している理由は理解できているでしょうか? 他の回答方法で a の配列に値の重複があった場合の挙動の差を調べてみてください。
renji

2018/09/23 13:19

ご返信をくださり、ありがとうございます! ほかのプログラム(自分でちょっと修正したやつですが)でやってみると、aに同じ値が入っている場合には、aの同じ値の最初のbの値が、あとからのbの値に修正されてしまっていました。 katoy様のプログラムを実行すると、2つのaの同じ値でbの値があとからのbの値に上書きされず、きちんと別々に表示されました。 プログラム内容が私には難しくて、どこがポイントなのか、恥ずかしながら、まだ分かっていないのですが、ソート部分で比較しているのと二次元配列になにかあるのかと思いました。 私の勉強不足で、きちんとした理解が及ばず、すみません。。 まだまだ勉強していきたいと思っておりますので、機会があれば、またご指導よろしくお願いします。 この度は教えてくださって、ありがとうございました!
katoy

2018/09/23 13:41

次のことが原因だと思います。 * aの中で何番目か調べ、bの同じ番号を取る場合は、最初に見つけた場所で処理してしまう。 * TreeMap の key に a の値を使う場合は、a に同じ値があると、最後の put(a[x] -> b[x]) だけしか TreeMap には保存されない。
renji

2018/09/24 01:26

ありがとうございます! katoy様のアドバイスを受けて。プログラムを調べていたところ、どうして上書きされてしまうのかをようやく理解できました! プログラムの流れを少しずつ把握できてきたので、勉強になりました。 この度は教えてくださって、ありがとうございました!
katoy

2018/09/24 01:31

a が同じ値だった時は、b の値の昇順になるようにすることも考えてみるとよいです。(a をすべて同じ値にして、動作チェックをしてみるとよいです。)
renji

2018/09/24 06:35

ありがとうございました! aの値がすべて同じだった場合、bの値はbの値の最後の数字にすべて上書きされてしまいました。 複雑で難しいですが、katoy様のプログラムを読んで、勉強させてもらおうと思います。 この度は教えてくださって、ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問