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

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

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

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Java

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

4回答

9759閲覧

2つの配列を用いて配列の中身が共通の数とどちらかに入っている数を表示させたいです。

ssssa

総合スコア39

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Java

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2018/07/16 06:48

Java初心者です。

<前提・実現したいこと>
----Prob8-11----
長さ10の整数型の配列変数を2つ用意し、それぞれに、各要素に1から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

下記コード詳細です。
public class Prob8_11 {

/** * @param args */ public static void main(String[] args) { int hairetu1[] = new int[10]; int hairetu2[] = new int[10]; int kyoutu[] = new int[10]; int dotiraka[] = new int[10]; System.out.print("配列1:"); for (int i = 0; i < 10; i++) { hairetu1[i] = (int) (Math.random() * 10) + 1; System.out.print(hairetu1[i] + " "); } System.out.println(" "); System.out.print("配列2:"); for (int i = 0; i < 10; i++) { hairetu2[i] = (int) (Math.random() * 10) + 1; System.out.print(hairetu2[i] + " "); } System.out.println(""); System.out.println("共通の数:"); for (int i = 0; i < 10; i++) { if (hairetu1[i] == hairetu2[i]) { kyoutu[i] = hairetu1[i] = hairetu2[i]; System.out.print(kyoutu[i] + " "); } } System.out.println(""); System.out.println("どちらかの数:"); for (int i = 0; i < 10; i++) { if (hairetu1[i] >= hairetu2[i]) { dotiraka[i] = hairetu1[i]; System.out.print(dotiraka[i] + " "); } } }

}

if文の条件がわからず、期待値通りの答えが出ません。
どなたかご教示していだけませんでしょうか?

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

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

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

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

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

momon-ga

2018/07/16 08:06

期待している内容とロジックがあまりにも違うので、日本語でいいので、ロジックを書いてください
euledge

2018/07/16 09:01

要は2つの配列を重複なくして結合するって事ですか?
ssssa

2018/07/16 09:16

結合ではなく、boolean配列を用いて判定するとのアドバイスがあり出来なくて悩んでました。もし同じ数が見つかった場合ははじいて判定するらしいのですが全く分からず現在に至ります。
euledge

2018/07/16 09:30

1から10までの数字と決まっているので、入っている数字と配列のインデックスを関連させてみるとboolean配列を使うという意味がわかると思いますよ
unz.hori

2018/07/18 07:03

結果を格納するのにArrayListを使って良いのならboolean配列は必要ない気もするけど制限あるのかな?
unz.hori

2018/07/18 07:26

同一の値が複数回出現するのかしないのかによっても結構難易度が変わってくるなぁ
guest

回答4

0

考え方のみ

どちらかに入っている
→HashSet

どちらにも入っている
→HashSet+remove(notIn)

どちらかのみ入っている
→HashSet+remove(どちらにも入っている)

投稿2018/07/29 23:53

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

ssssa

2018/08/05 14:05

お返事が遅れまして大変申し訳ございません。 考え方ありがとうございます。 参考にさせていただきます。
guest

0

両方に存在する数:(bpthExist) - 2つのListを順次繰り返して、合致したものだけをいれる。

片方には存在する数(両方いてもいい) - 2つのListを合成させたときに、自動的に重複が削除される java.util.Setの実装クラスを使うか、streamのdistinctを使って重複を削除する。

  1. 両方に存在するもの

java

1 public List<Integer> bothExist(List<Integer> first, List<Integer> second) { 2 return first.stream().map(f -> exists(f, second)).filter(f -> f.isPresent()).map(f -> f.get()).sorted().collect(Collectors.toList()); 3 } 4 5 static Optional<Integer> exists(Integer select, List<Integer> targets) { 6 return targets.stream().filter(target -> target.intValue() == select.intValue()).findFirst(); 7 }
  1. 片方に存在していればよいもの

java

1public List<Integer> leastExist(List<Integer> first, List<Integer> second) { 2 3 first.addAll(second); 4 5 return first.stream().distinct().sorted().collect(Collectors.toList()); 6}

投稿2018/07/29 16:07

A-pZ

総合スコア12011

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

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

swordone

2018/07/30 00:52

1. 前者のコードで、existsメソッドの返り値をbooleanにして最初からfilterを使えば早いのでは 2. 後者はListを書き換えているので、Stream#concatのほうがベターな気がします
guest

0

ベストアンサー

えーと、積集合(intersection)と和集合(union)をつくればいいのね。

Java

1import java.util.Arrays; 2import java.util.HashSet; 3 4public class set_operations { 5 6 static void intersection(int[] set1, int[] set2) { 7 HashSet<Integer> uniq = new HashSet<Integer>(); 8 int inx1 = 0; 9 int inx2 = 0; 10 while ( inx1 < set1.length && inx2 < set2.length ) { 11 int val1 = set1[inx1]; 12 int val2 = set2[inx2]; 13 if ( val1 < val2 ) { 14 ++inx1; 15 } else if ( val1 > val2 ) { 16 ++inx2; 17 } else { 18 if ( uniq.add(val1) ) { System.out.printf("%d ", val1); } 19 ++inx1; 20 ++inx2; 21 } 22 } 23 } 24 25 static void union(int[] set1, int[] set2) { 26 HashSet<Integer> uniq = new HashSet<Integer>(); 27 int inx1 = 0; 28 int inx2 = 0; 29 while ( inx1 < set1.length && inx2 < set2.length ) { 30 int val1 = set1[inx1]; 31 int val2 = set2[inx2]; 32 if ( val1 < val2 ) { 33 if ( uniq.add(val1) ) { System.out.printf("%d ", val1); } 34 ++inx1; 35 } else if ( val1 > val2 ) { 36 if ( uniq.add(val2) ) { System.out.printf("%d ", val2); } 37 ++inx2; 38 } else { 39 if ( uniq.add(val1) ) { System.out.printf("%d ", val1); } 40 ++inx1; 41 ++inx2; 42 } 43 } 44 while ( inx1 < set1.length ) { 45 int val1 = set1[inx1]; 46 if ( uniq.add(val1) ) { System.out.printf("%d ", val1); } 47 ++inx1; 48 } 49 while ( inx2 < set2.length ) { 50 int val2 = set2[inx2]; 51 if ( uniq.add(val2) ) { System.out.printf("%d ", val2); } 52 ++inx2; 53 } 54 } 55 56 57 public static void main(String[] arg) { 58 int set1[] = new int[] { 4, 9, 4, 3, 6, 8, 7, 1, 3, 10 }; 59 int set2[] = new int[] { 7, 3, 10, 7, 5, 9, 4, 9, 9, 1 }; 60 61 Arrays.sort(set1); 62 Arrays.sort(set2); 63 64 System.out.print("\nintersection: "); intersection(set1, set2); 65 System.out.print("\nunion: "); union(set1, set2); 66 67 } 68} 69 70/* 実行結果 71intersection: 1 3 4 7 9 10 72union: 1 3 4 5 6 7 8 9 10 73*/

投稿2018/07/29 02:20

episteme

総合スコア16614

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

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

ssssa

2018/08/05 14:04

本当にありがとうございます。お返事が遅れまして大変申し訳ございません。 参考にさせていただきます。
guest

0

あまり良い考え方ではなかったのでやり直し。
共通を表す条件どちらかを表す条件を考えて下さい。

ヒント:

text

1true && true = true 2true && false = false 3 4true || true = true 5true || false = true

java

1boolean flags1[] = new boolean[10]; //配列1用フラグ 2boolean flags2[] = new boolean[10]; //配列2用フラグ 3 4//それぞれのフラグを立てる 5for (int i = 0; i < 10; i++) { 6 flags1[hairetu1[i]-1] = true; 7 flags2[hairetu2[i]-1] = true; 8} 9 10: 11 12System.out.println("共通の数:"); 13for (int i = 0; i < 10; i++) { 14 if (共通を表す条件) { 15 System.out.print(i+1 + " "); 16 } 17} 18 19: 20 21System.out.println("どちらかの数:"); 22for (int i = 0; i < 10; i++) { 23 if (どちらかを表す条件) { 24 System.out.print(i+1 + " "); 25 } 26}

ダメ回答

「どちらか」だけ丸投げ回答。
「共通」は自分で考えてね。

ヒント:

text

1true && true = true 2true && false = false

java

1//どちらかに入っているフラグ 2boolean flagsOr[] = new boolean[10]; 3 4//orなので気にせず上書き 5for (int i = 0; i < 10; i++) { 6 flagsOr[hairetu1[i]-1] = true; 7 flagsOr[hairetu2[i]-1] = true; 8} 9 10System.out.println("どちらかの数:"); 11for (int i = 0; i < 10; i++) { 12 if (flagsOr[i]) { 13 System.out.print(i+1 + " "); 14 } 15} 16

text

1配列1:10 9 2 8 10 9 8 7 10 5 2配列2:3 3 7 3 10 4 3 7 10 7 3 4どちらかの数: 52 3 4 5 7 8 9 10

投稿2018/07/18 08:01

編集2018/07/18 08:13
fuzzball

総合スコア16731

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

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

ssssa

2018/07/23 13:01

ありがとうございます。参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問