🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

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

Q&A

解決済

2回答

2488閲覧

乱数から上限と下限を設定して間の値を表示したい

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

0クリップ

投稿2021/02/02 08:52

編集2021/02/02 09:06

前提・実現したいこと

1~99の乱数100個から上限と下限を入力して間の値を昇順で表示したいです。

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

Arrays.sortで昇順からi番目のを表示してしまうと重複した値が原因でずれてしまい、うまく上限と下限が反映しなくなる。

実行例
乱数一覧
34 33 46 17 56 73 71 20 17 81
28 54 75 36 76 4 7 78 81 58
80 5 82 3 39 8 48 42 81 81
45 51 72 31 94 20 59 37 86 77
74 30 59 78 16 97 61 94 7 22
85 75 7 27 93 4 38 72 92 70
99 5 63 31 52 96 45 93 41 63
9 79 2 48 21 58 31 83 32 69
66 6 6 21 28 33 47 6 76 45
52 83 15 43 49 85 41 5 5 67

抽出する下限と上限を入力してください
下限
16
上限
21

16と21の間のデータは昇順で
15 16 17 17 20 20
の6件です

このように15が表示されてしまったり、21が表示されなくなります。

該当のソースコード

Java

1import java.util.Arrays; 2import java.util.Random; 3import java.util.Scanner; 4 5public class RandomNumber { 6 public static void main(String[] args) { 7 Random ran = new Random(); 8 // 要素数100の配列を宣言 9 int[] lists = new int[100]; 10 System.out.print("乱数一覧"); 11 for (int i = 0; i < lists.length; i++) { 12 int Number = ran.nextInt(99) + 1; 13 lists[i] = Number; 14 } 15 // 改行と空白を付与し、一覧を表示 16 for (int i = 0; i < lists.length; i++) { 17 if (i % 10 == 0) { 18 System.out.println(""); 19 } 20 System.out.print(lists[i] + " "); 21 } 22 // 上限と下限を入力する 23 Scanner sc = new Scanner(System.in); 24 25 System.out.println("\n"); 26 System.out.println("抽出する下限と上限を入力してください"); 27 System.out.println("下限"); 28 int min = sc.nextInt(); 29 System.out.println("上限"); 30 int max = sc.nextInt(); 31 // 昇順にソートする 32 Arrays.sort(lists); 33 34 System.out.printf("%n%dと%dの間のデータは昇順で%n", min, max); 35 36 // 昇順の件数をカウントする変数を宣言 37 int count = 0; 38 for (int i = min; i <= max; i++) { 39 System.out.print(lists[i] + " "); 40 count++; 41 } 42 43 System.out.printf("%nの%d件です%n%n", count); 44 sc.close(); 45 } 46} 47

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

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

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

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

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

dodox86

2021/02/02 09:21

> Arrays.sortで昇順からi番目のを表示してしまうと重複した値が原因でずれてしまい、うまく上限と下限が反映しなくなる。 それは当然そうやっているのでそうなっているとしか。最初に自力でminとmax の位置を探しに行く必要があります。
guest

回答2

0

ソートした後で、min 以上で max 以下のものだけを表示すればよいのでは?

Java

1 for (int i = 0; i < lists.length; i++) { 2 if (lists[i] >= min) { 3 if (lists[i] > max) break; 4 System.out.print(lists[i] + " "); 5 count++; 6 } 7 }

投稿2021/02/02 12:21

kazuma-s

総合スコア8224

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

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

0

ベストアンサー

最初に100個乱数の入った配列を作っていますが、これに重複した値が入った場合が考慮されてないことが原因かと思います。
上限と下限ではなく、配列の要素「下限の値」~配列の要素「上限の値」までが出力されてます。
昇順に並べ替えても、重複した値が一つでもあれば順番は狂います。

投稿2021/02/02 09:23

norapomu

総合スコア224

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

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

退会済みユーザー

退会済みユーザー

2021/02/02 10:46

回答ありがとうございます。 ご指摘を元に書き直してみたのですが、何故かまだあらぬ値が出てしまいます。 ---------------------------------------------------------------------------------- ソースコード: // 昇順の件数をカウントする変数を宣言 int count = 0; for(int i = 0; i < lists.length; i++) { if(min <= lists[i] && lists[i] <= max) { Arrays.sort(lists); System.out.print(lists[i] + " "); count++; } } System.out.printf("%nの%d件です%n%n", count); ------------------------------------------------------------------------ 実行例: 乱数一覧 42 67 68 99 87 9 16 75 42 31 72 11 12 69 38 75 84 9 63 89 67 80 14 86 58 20 70 12 6 74 76 78 75 12 81 43 39 26 78 20 63 79 8 55 82 46 3 11 65 23 60 67 9 90 38 1 69 62 77 21 13 67 78 71 29 2 34 71 97 63 15 21 48 98 81 44 26 74 18 16 16 29 71 36 40 33 87 2 28 7 63 48 74 19 33 58 61 91 40 5 抽出する下限と上限を入力してください 下限 90 上限 99 90と99の間のデータは昇順で 3 90 91 97 98 99 の6件です
norapomu

2021/02/02 11:17

配列全てに対して、ifの条件を満たしているかどうか、というのは合ってます。 ただ、先に配列をソートしておく必要があることと、条件を満たしたときにソートするのは間違ってます。 あと、この方法だとやはり配列に重複した値が入った場合の考慮がされないかと思います・・・ので、重複した値が入らないように工夫する必要があるかと思います。
退会済みユーザー

退会済みユーザー

2021/02/02 14:16

Set<Integer> linkedHash = new LinkedHashSet<Integer>();を利用して解決いたしました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問