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

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

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

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

Q&A

解決済

1回答

1575閲覧

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

aaaajj

総合スコア5

Java

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

0グッド

0クリップ

投稿2020/07/27 08:09

前提・実現したいこと

以下の例を実現させたいのですが、どちらか入ってる数とその値を小さい順に並べる方法がわかりません。

配列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

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

どちらか片方に入ってる値になってしまう、小さい順に表示されない

該当のソースコード

java

1public class Problem8_11 { 2 /** 3 * メインメソッド メイン処理を実行します。 4 * 5 * @param args 6 * プログラム起動引数 7 */ 8 public static void main(String[] args) { 9 // 初期値を設定 10 int num1[] = new int[10]; 11 int num2[] = new int[10]; 12 int same[] = new int[10]; 13 int side[] = new int[10]; 14 15 random(num1); 16 random(num2); 17 18 int n = 0, m = 0; 19 // forループ 20 for (int i = 0; i < 10; i++) { 21 // same,side判定 22 if (find(num2, num1[i])) { 23 n = add(same, n, num1[i]); 24 } else { 25 m = add(side, m, num1[i]); 26 } 27 } 28 // forループ 29 for (int i = 0; i < 10; i++) { 30 31 // side判定 32 if (!find(num1, num2[i])) { 33 m = add(side, m, num2[i]); 34 } 35 } 36 // 文字列を表示 37 System.out.print("配列1:"); 38 print(num1, 10); 39 System.out.print("配列2:"); 40 print(num2, 10); 41 System.out.print("共通の数:"); 42 print(same, n); 43 System.out.print("どちらかの数:"); 44 print(side, m); 45 } 46 47 /** 48 * 配列の表示 49 */ 50 public static void print(int[] a, int n) { 51 // forループ 52 for (int i = 0; i < n; i++) { 53 System.out.print(" " + a[i]); 54 55 } 56 57 System.out.println(); 58 } 59 60 /** 61 * 乱数を設定 62 */ 63 public static void random(int[] a) { 64 // forループ 65 for (int i = 0; i < 10; i++) { 66 // 乱数設定 67 a[i] = (int) (Math.random() * 10) + 1; 68 } 69 } 70 71 /** 72 * 結果処理判定 73 */ 74 public static boolean find(int[] a, int e) { 75 // forループ 76 for (int i = 0; i < 10; i++) { 77 if (a[i] == e) { 78 return true; 79 } 80 } 81 return false; 82 } 83 84 /** 85 * 配列に追加する 86 */ 87 public static int add(int[] a, int n, int e) { 88 // forループ 89 for (int i = 0; i < n; i++) { 90 if (a[i] == e) { 91 return n; 92 } 93 } 94 a[n] = e; 95 return n + 1; 96 } 97}

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

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

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

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

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

aaaajj

2020/07/27 08:36

ご返信ありがとうございます。 はい、私が問題の意味を履き違えていて再度質問をさせていただきました。
KoichiSugiyama

2020/07/27 08:46

先の質問でベストアンサーの回答にあったHashSetを使うのが現実的な解だと思いますが、それを使わずにifで実現しなければいけない理由でもあるのでしょうか。学校か何かの課題ですか?
aaaajj

2020/07/27 08:51 編集

問題の意味を履き違えており、再度質問させていただきました。
aaaajj

2020/07/27 08:53

以前の回答はどちらかに表示されているものでしたが、問題はどちらかに値が入っていれば表示するというものだったので再度質問させていただきました。
guest

回答1

0

ベストアンサー

前回の回答の追記のコードの (bit1 ^ bit2) を (bit1 | bit2) にするだけなんですが。

Java

1class Test { 2 public static void main(String[] args) { 3 int num1[] = { 4, 9, 4, 3, 6, 8, 7, 1, 3, 10 }; 4 int num2[] = { 7, 3, 10, 7, 5, 9, 4, 9, 9, 1 }; 5 int bit1 = setBit(num1); 6 int bit2 = setBit(num2); 7 System.out.print("配列1:"); printA(num1); 8 System.out.print("配列2:"); printA(num2); 9 System.out.print("共通の数: "); printB(bit1 & bit2); 10 System.out.print("どちらかに入っている数:"); printB(bit1 | bit2); 11 System.out.print("一方だけに入っている数:"); printB(bit1 ^ bit2); 12 System.out.print("配列1 だけに入っている数:"); printB(bit1 & ~bit2); 13 System.out.print("配列2 だけに入っている数:"); printB(~bit1 & bit2); 14 } 15 16 static int setBit(int[] a) { 17 int bit = 0; 18 for (int i = 0; i < a.length; i++) bit |= 1 << a[i]; 19 return bit; 20 } 21 22 static void printA(int[] a) { // print Array 23 for (int i = 0; i < a.length; i++) System.out.print(" " + a[i]); 24 System.out.println(); 25 } 26 27 static void printB(int bit) { // print Bits 28 for (int i = 1; i <= 10; i++) 29 if ((bit >> i & 1) != 0) System.out.print(" " + i); 30 System.out.println(); 31 } 32}

実行結果

plain

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

理解できない場合は、どこが分からないのかを具体的に質問してください。
そうすれば、できるだけ説明します。
理解できた場合は、コードの説明をお願いします。

追記
ビット処理も HashSet も使用しないなら、

Java

1import java.util.Arrays; 2 3class Test { 4 public static void main(String[] args) { 5 int num1[] = { 4, 9, 4, 3, 6, 8, 7, 1, 3, 10 }; 6 int num2[] = { 7, 3, 10, 7, 5, 9, 4, 9, 9, 1 }; 7 int same[] = new int[10]; 8 int side[] = new int[10]; 9 10 int n = 0, m = 0; 11 12 for (int i = 0; i < num1.length; i++) { 13 if (find(num2, num1[i])) // num2 の中に num1[i] があれば 14 n = add(same, n, num1[i]); // same に num1[i] を追加 15 m = add(side, m, num1[i]); // side に num1[i] を追加 16 } 17 18 for (int i = 0; i < num2.length; i++) 19 m = add(side, m, num2[i]); // side に num2[i] を追加 20 21 Arrays.sort(same, 0, n); // データ数 n の same をソート 22 Arrays.sort(side, 0, m); // データ数 m の side をソート 23 24 System.out.print("配列1:"); print(num1, num1.length); 25 System.out.print("配列2:"); print(num2, num2.length); 26 System.out.print("共通の数:"); print(same, n); 27 System.out.print("どちらかの数:"); print(side, m); 28 } 29 30 public static void print(int[] a, int n) { 31 for (int i = 0; i < n; i++) 32 System.out.print(" " + a[i]); 33 System.out.println(); 34 } 35 36 public static boolean find(int[] a, int e) { 37 for (int i = 0; i < a.length; i++) 38 if (a[i] == e) return true; // 見つかれば true を返す 39 return false; // 見つからなかったので false を返す 40 } 41 42 public static int add(int[] a, int n, int e) { 43 for (int i = 0; i < n; i++) 44 if (a[i] == e) return n; // 既にあればデータ数はそのまま 45 a[n] = e; // 無かったので追加 46 return n + 1; // データ数を増やす 47 } 48}

投稿2020/07/27 12:30

編集2020/07/28 01:14
kazuma-s

総合スコア8224

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

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

aaaajj

2020/07/28 08:23

前回に引き続きご丁寧な回答ありがとうございます。
kazuma-s

2020/07/28 08:28

理解できたのかできなかったのかを尋ねています。丁寧なコメントをお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問