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

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

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

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

配列

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

Q&A

解決済

1回答

1653閲覧

正確に集合積を出力する

kt-

総合スコア5

Java

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

配列

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

0グッド

0クリップ

投稿2021/01/13 12:15

編集2021/01/13 13:29

###直面した問題
私は以下のように積集合のプログラムを作成しました。しかしながら配列の要素を変えると、時々正確に出力されない事があります。例えば、
int[]A= new int[]{2,1,4,9,5};
int[]B= new int[]{2,1,5,9,6};
の時、通常なら1 2 5 9と表示されるべきですが、私の場合1 2 9と表示されてしまうのです。要素数を変えても然りです。
以下のプログラムのどこに原因があるのか、悩んでも分からなかったので、お教え頂ければ幸いです。
###実際のプログラム

static int[] intersection(int[] A, int[] B) { HashSet<Integer> uniq =new HashSet<Integer>(); int d=0; int e=0; while( d<A.length && e<B.length){ int v=A[d]; int w=B[e]; if (v<w) {++d; } else if(v>w) {++e; } else { if (uniq.add(v)) { }++d;++e; } } System.out.printf("\n"); int[] C=new int[uniq.size()]; int x=0; for(Integer n:uniq){ C[x++]=n; } return C; } public static void main(String args[]) {          int[]A= new int[]{2,1,4,9,5};          int[]B= new int[]{2,1,5,9,6};          int[] C = intersection(A, B); for(int i=0; i<C.length; i++){ System.out.printf("%d ", C[i]); }

###解決後のプログラム

public static int[] intersection(int[] A, int[] B) { HashSet<Integer> uniq = new HashSet<Integer>(); int d = 0; int e = 0; while (d < A.length && e < B.length) { int v = A[d]; int w = B[e]; if (v < w) { ++d; } else if (v > w) { ++e; } else { if (uniq.add(v)) { } ++d;++e; } } System.out.printf("\n"); int[] C=new int[uniq.size()]; int x=0; for(Integer n:uniq){ C[x++]=n; } return C; } public static void main(String args[]) { int[]A= new int[]{2,1,4,9,5}; Arrays.sort(A); int[]B= new int[]{2,1,5,3}; Arrays.sort(B); int[] C = intersection(A, B); for(int i=0; i<C.length; i++){ System.out.printf("%d ", C[i]); } System.out.println();

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

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

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

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

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

guest

回答1

0

ベストアンサー

以下のプログラムのどこに原因があるのか、

原因ですが、intersectionメソッドの以下の部分は、配列AとBの要素の並びが昇順(小さい順)であることに依存しています。

Java

1// 読みやすくする為、整形済みです。 2static int[] intersection(int[] A, int[] B) { 3 HashSet<Integer> uniq = new HashSet<Integer>(); 4 int d = 0; 5 int e = 0; 6 while (d < A.length && e < B.length) { 7 int v = A[d]; 8 int w = B[e]; 9 if (v < w) { 10 ++d; 11 } else if (v > w) { 12 ++e; 13 } else { 14 if (uniq.add(v)) { 15 } 16 ++d; 17 ++e; 18 } 19 } 20

ですので、Aが{1, 2, 4, 5, 9, 10}、Bが{0, 1, 2, 5, 6, 9, 11, 12}のように昇順にソート済みあれば、正しく出力されています。

ただ、if (uniq.add(v)) {}部分のifのブロックは、意味がないですね。

並び順に依存しないようにするには、あらかじめソートするか、「Aの要素がBに含まれているかどうか」を判定していけばよいと思います。

投稿2021/01/13 13:04

編集2021/01/13 13:10
dodox86

総合スコア9256

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

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

kt-

2021/01/13 13:26

ご教授通りソートを施すことで何とか解決する事が出来ました! ご教授深く感謝申し上げます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問