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

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

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

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

Q&A

解決済

3回答

905閲覧

2つの配列から数値を取り出したい

aaaajj

総合スコア5

Java

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

0グッド

0クリップ

投稿2020/07/17 02:53

編集2020/07/17 05:10

前提・実現したいこと

2つの配列から、共通している数値とどちらかにしかない数値を表示させたいです。

配列1: 4 9 4 3 6 8 7 1 3 10
配列2: 7 3 10 7 5 9 4 9 9 1
共通の数:1 3 4 7 9 10
どちらか入っている数:1 3 4 5 6 7 8 9 10

発生している問題・エラーメッセージ

if文が正確に機能していないのか、期待している数値が表示されません。

該当のソースコード

java

1public static void main(String[] args) { 2 int num1[] = new int[10]; 3 int num2[] = new int[10]; 4 int same[] = new int[10]; 5 int side[] = new int[10]; 6 System.out.print("配列1:"); 7 for (int i = 0; i < 10; i++) { 8 num1[i] = (int) (Math.random() * 10) + 1; 9 System.out.print(num1[i] + " "); 10 } 11 System.out.println(" "); 12 System.out.print("配列2:"); 13 for (int i = 0; i < 10; i++) { 14 num2[i] = (int) (Math.random() * 10) + 1; 15 System.out.print(num2[i] + " "); 16 } 17 System.out.println(""); 18 System.out.println("共通の数:"); 19 for (int i = 0; i < 10; i++) { 20 if (num1[i] == num2[i]) { 21 same[i] = num1[i] = num2[i]; 22 System.out.print(same[i] + " "); 23 } 24 } 25 System.out.println(""); 26 System.out.println("どちらかの数:"); 27 for (int i = 0; i < 10; i++) { 28 if (num1[i] >= num2[i]) { 29 side[i] = num1[i]; 30 System.out.print(side[i] + " "); 31 } 32 } 33 } 34} 35 36

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

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

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

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

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

aaaajj

2020/07/17 03:09

ご返信ありがとうございます。 表示される数値がバラバラで期待している数値になりません。
m.ts10806

2020/07/17 03:46

「期待している数値」のケースパターン挙げた方が良いです。 なにを投入したら何が出る、といった具合に。 で、それなのに何が出てしまう(起きている現象) 仕様は作る人が決めたものなので書かないと分かりませんし
fuzzball

2020/07/17 05:08

1. 「共通している数値」とは何が共通している数値でしょうか? 2. 「どちらかにしかない数値」に対して num1[i] >= num2[i] というコードを書いていますが、「どちらかにしかない数値」の判定には全く見えません。なぜこのコードを書いたのか説明して下さい。 3. コードの前半と後半は同じように見えますが、不要なら片方を削除して下さい。
aaaajj

2020/07/17 05:13

1.例に記載いたしました。 2.解決策が分からず記載してしまったものなので、深い根拠などはありません。 3.削除いたしました。
kazuma-s

2020/07/18 07:27

解決済みになり、質問が編集されて例がついていますが、 「どちらかにしかない数値」を表示させたいなのに 「どちらかに入っている数」を表示しています。 配列1: 4 9 4 3 6 8 7 1 3 10 配列2: 7 3 10 7 5 9 4 9 9 1 共通の数:1 3 4 7 9 10 どちらか入っている数:1 3 4 5 6 7 8 9 10 どちらかにしかない数:5 6 8 ではないのですか?
guest

回答3

0

問題点を2つ指摘します。

共通の数の判定

java

1if (num1[i] == num2[i]) {

この判定方法では、出現位置まで一緒でないと同じと判定されません。
※{1,2}と{2,1}では、同じと判定されない。

結果出力のやりかた

以下のように、判定と出力を同時に行おうとすると数字が必ずしも小さい順に表示されません。

java

1// 共通の数 2same[i] = num1[i] = num2[i]; 3System.out.print(same[i] + " "); 4// どちらかの数 5side[i] = num1[i]; 6System.out.print(side[i] + " ");

たとえば、共通の数で、{2,1}と{2,1}となっていた場合、1 2の順でなく、 2 1と表示されます。

--
どう修正するか?
sameとsideを作る処理と、表示の処理を分けてください。

配列に値を設定しているので、表示の部分は以下になるだろうと想像します。

java

1System.out.println(""); 2System.out.println("共通の数:"); 3for (int i = 0; i < 10; i++) { 4 if (same[i] > 0) { 5 System.out.print(same[i] + " "); 6 } 7} 8 9System.out.println(""); 10System.out.println("どちらかの数:"); 11for (int i = 0; i < 10; i++) { 12 if (side[i] > 0) { 13 System.out.print(side[i] + " "); 14 } 15} 16

なので、あとはsideとsameの配列の所定の位置に値を設定していけば良いです。

どちらかの数は、num1とnum2同時に設定することが可能ですが、
共通の数の検索は愚直に2重ループで確認するぐらいしか思い浮かびませんでした。

java

1// どちらかの数 2for (int i = 0; i < 10; i++) { 3 side[num1[i]-1] = num1[i]; 4 side[num2[i]-1] = num2[i]; 5 // 共通の数 6 for(int j = 0; j < 10; j++) { 7 if(num1[i] == num2[j]) same[num1[i]-1] = num1[i]; 8 if(num2[i] == num1[j]) same[num2[i]-1] = num2[i]; 9 } 10}

投稿2020/07/17 06:16

編集2020/07/17 13:28
momon-ga

総合スコア4820

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

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

aaaajj

2020/07/17 06:49

ご回答ありがとうございます。 sameとsideを作る処理と、表示の処理を分けてください。とのことでしたが表示の部分より先に設定を記載すべきか、後に書き戻り値を使うかということでしょうか?
momon-ga

2020/07/17 07:07

やりやすいほうでいいと思います。
aaaajj

2020/07/17 07:13

ありがとうございます。 試してみたところ、要素数を超えるインデックスを指定したのが原因なのかエラーになってしまったのですが、訂正方法をご教授いただければ幸いです。
momon-ga

2020/07/17 07:25

要素数を超えないようにしてください。としか言いようがないです。
aaaajj

2020/07/17 08:52

了解致しました、ありがとうございます。
guest

0

ベストアンサー

HashSet を使ってはいけませんか?

Java

1import java.util.HashSet; 2 3class Test { 4 public static void main(String[] args) { 5 int num1[] = new int[10]; 6 int num2[] = new int[10]; 7 System.out.print("配列1:"); 8 for (int i = 0; i < 10; i++) { 9 num1[i] = (int) (Math.random() * 10) + 1; 10 System.out.print(num1[i] + " "); 11 } 12 System.out.println(); 13 14 System.out.print("配列2:"); 15 for (int i = 0; i < 10; i++) { 16 num2[i] = (int) (Math.random() * 10) + 1; 17 System.out.print(num2[i] + " "); 18 } 19 System.out.println(); 20 21 HashSet<Integer> set1 = new HashSet<>(); 22 for (int e : num1) set1.add(e); 23 HashSet<Integer> set2 = new HashSet<>(); 24 for (int e : num2) set2.add(e); 25 26 HashSet<Integer> same = new HashSet<>(set1); 27 same.retainAll(set2); 28 System.out.println("共通の数: " + same); 29 30 HashSet<Integer> side = new HashSet<>(set1); 31 side.addAll(set2); 32 side.removeAll(same); 33 System.out.println("どちらかの数: " + side); 34 } 35}

実行例

配列1:4 4 5 10 2 9 4 1 3 3 配列2:9 6 5 3 1 9 3 1 8 9 共通の数: [1, 3, 5, 9] どちらかの数: [2, 4, 6, 8, 10]

追記

Java

1class Test { 2 public static void main(String[] args) { 3 int num1[] = new int[10]; 4 int num2[] = new int[10]; 5 int same[] = new int[10]; 6 int side[] = new int[10]; 7 8 setRandom(num1); 9 setRandom(num2); 10 11 int n = 0, m = 0; 12 for (int i = 0; i < 10; i++) 13 if (find(num2, num1[i])) 14 n = add(same, n, num1[i]); 15 else 16 m = add(side, m, num1[i]); 17 18 for (int i = 0; i < 10; i++) 19 if (!find(num1, num2[i])) 20 m = add(side, m, num2[i]); 21 22 System.out.print("配列1:"); print(num1, 10); 23 System.out.print("配列2:"); print(num2, 10); 24 System.out.print("共通の数:"); print(same, n); 25 System.out.print("どちらかの数:"); print(side, m); 26 } 27 28 static void print(int[] a, int n) { 29 for (int i = 0; i < n; i++) 30 System.out.print(" " + a[i]); 31 System.out.println(); 32 } 33 34 static void setRandom(int[] a) { 35 for (int i = 0; i < 10; i++) 36 a[i] = (int) (Math.random() * 10) + 1; 37 } 38 39 static boolean find(int[] a, int e) { 40 for (int i = 0; i < 10; i++) 41 if (a[i] == e) return true; 42 return false; 43 } 44 45 static int add(int[] a, int n, int e) { 46 for (int i = 0; i < n; i++) 47 if (a[i] == e) return n; 48 a[n] = e; 49 return n + 1; 50 } 51}

追記2
こんなやり方もあります。

Java

1class Test { 2 public static void main(String[] args) { 3 int num1[] = new int[10]; 4 int num2[] = new int[10]; 5 6 int bit1 = setRandomAndBit(num1); 7 int bit2 = setRandomAndBit(num2); 8 9 System.out.print("配列1:"); print(num1); 10 System.out.print("配列2:"); print(num2); 11 System.out.println("共通の数: "); print2(bit1 & bit2); 12 System.out.println("どちらかの数: "); print2(bit1 ^ bit2); 13 } 14 15 static int setRandomAndBit(int[] a) { 16 int bit = 0; 17 for (int i = 0; i < 10; i++) { 18 a[i] = (int) (Math.random() * 10) + 1; 19 bit |= 1 << a[i]; 20 } 21 return bit; 22 } 23 24 static void print(int[] a) { 25 for (int i = 0; i < 10; i++) 26 System.out.print(" " + a[i]); 27 System.out.println(); 28 } 29 30 static void print2(int bit) { 31 for (int i = 1; i <= 10; i++) 32 if ((bit >> i & 1) != 0) System.out.print(" " + i); 33 System.out.println(); 34 } 35}

投稿2020/07/17 04:35

編集2020/07/17 08:55
kazuma-s

総合スコア8224

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

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

aaaajj

2020/07/17 05:11

ご回答ありがとうございます。 if文での制作を考えています。 すみません、説明不足でした。
aaaajj

2020/07/17 08:52

わざわざ追記していただきありがとうございました。
aaaajj

2020/07/17 09:51

ありがとうございます! 一点質問なのですが、System.out.print("配列1:"); の後の print(num1, 10);が初見だったので、理解したいのですが何と検索すれば良いでしょうか? System.out.printの説明ばかりでなぜSystem.out.printの後にprintのみで記述できるのか知りたいです。 長文失礼しました。
kazuma-s

2020/07/17 18:37

その print は、class Test 内で static void print(int[] a, int n) { ... } と定義したメソッドです。 setRandom, find, add と同じです。
momon-ga

2020/07/27 16:02

今おもうと、質問者の望む結果でなく > どちらかの数: [2, 4, 6, 8, 10] なんで、xorなんだろ思ったけど、わざとだったんですかねぇ。 https://teratail.com/questions/280639
guest

0

まずは乱数ではなく、定数を表示させてみてはどうですか?
定数なら、どのような法則で表示されるのかわかるので、ロジックのどこが悪いのか気づくことができると思います。

投稿2020/07/17 03:23

perorin0418

総合スコア90

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問