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

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

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

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

ArrayList

Java用のタグです。arrayListはListインターフェースを実装した、リサイズ可能な配列用クラスです。

Q&A

解決済

4回答

7081閲覧

小さい順に並べ替えて表示,それまで入力され続けていた数値は、ArrayListに格納し、適切な場所に挿入できるようにしたい。

ssssa

総合スコア39

Java

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

ArrayList

Java用のタグです。arrayListはListインターフェースを実装した、リサイズ可能な配列用クラスです。

0グッド

0クリップ

投稿2018/09/19 15:04

Java

1public static void main(String[] args) { 2 List<Integer> list = new ArrayList<Integer>(); 3 while (true) { 4 Random rnd = new Random(); 5 int v = rnd.nextInt(10); 6 System.out.println("0から10の値を出力:" + v); 7 System.out.println(" "); 8 System.out.println("出力された数" + v); 9 System.out.println(" "); 10 for (int i = 0; i < list.size(); i++) { 11 if (v == 0) { 12 break; 13 } 14 list.add(v); 15 16 } 17 18 } 19 } 20} 21

上記のように書きましたら、無限ループになってしまい期待値と全く違うものになってしまいます。
0~10の値を出力:5

出力された数:5

0~10の値を出力:9

出力された数:5 9 ← 9は5より大きいので、5の後に挿入する。

0~10の値を出力:1

出力された数:1 5 9 ← 1は5より大きいので、5の前に挿入する。

0~10の値を出力:3

出力された数:1 3 5 9 ← 3は1と5の間なので、1と5の間に挿入する。

0~10の値を出力:9

出力された数:1 3 5 9 9 ← すでに入力された数値も、重複してて登録する。

0~10の値を出力:0 ← 0が出たら、出力を終える
上記はあくまで例なのですが、このように表示したいです。
ご教示願います。

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

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

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

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

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

guest

回答4

0

whileから抜ける条件が一切ありません。
forの中でbreakを書いていますが、これはforからしか脱出できません。
そもそも、forの継続条件を満たせないので、決してforの中に入れません。

ポイントとしては、
0. 「0だった時」の脱出条件をforの前に書く
0. ループで挿入する場所を探し、引数2つのaddを使う
0. 「出力された数」では、リスト内の数字をすべて出力する

です。
「昇順での挿入位置を探す」というメソッドとしては、Collections.binarySearchはありますが。

投稿2018/09/19 15:30

swordone

総合スコア20649

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

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

ssssa

2018/09/22 17:50

swordone様アドバイスありがとうございます。参考にさせていただきます。
guest

0

毎周リストをソートするのが安直な解決法です。

Java

1List<Integer> list = new ArrayList<>(); 2Random rnd = new Random(); // Randomインスタンスは一回生成すれば充分 3 4while (true) { 5 int v = rnd.nextInt(10); 6 System.out.println("0から10の値を出力:" + v); 7 System.out.println(); 8 9 if (v == 0) { 10 break; 11 } 12 list.add(v); 13 14 リストをソートする; 15 16 System.out.println("出力された数" + v); 17 リストの要素を順に表示する; 18}

ソートの方法及び表示の方法はもうちょっと考えましょう。


よりスマートな方法を検討しているなら、二分木について調べてみると良いでしょう。

投稿2018/09/19 15:10

編集2018/09/19 15:17
LouiS0616

総合スコア35658

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

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

ssssa

2018/09/22 17:49

Louis様ありがとうございます。参考になりました。
guest

0

ベストアンサー

java

1import java.util.*; 2 3public class Main { 4 public static void main(String[] args) { 5 6 ArrayList <Integer> numbers = new ArrayList<>(); 7 Random rand = new Random(); 8 9 while(true){ 10 int value = rand.nextInt(10); 11 System.out.println("出力された数値:" + value); 12 if(value == 0){ 13 break; 14 } 15 numbers.add(value); 16 Collections.sort(numbers); 17 System.out.println(numbers); 18 } 19 } 20}

投稿2018/09/20 01:30

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

ssssa

2018/09/22 17:56

Stars様:ありがとうございます。答えにたどり着かず悩んでました。素晴らしいコード参考にさせていただきます。ありがとうございます。
guest

0

java.util.TreeSet 等適切なクラスを使ったほうがいいです。

重複可を見逃してた・・・誤答

投稿2018/09/19 15:56

編集2018/09/19 21:29
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2018/09/19 15:57

補足 この実装は、基本オペレーション(add、remove、およびcontains)に保証済みのlog(n)時間コストを提供します。
swordone

2018/09/19 15:58

TreeSetだと重複が入らないから、最後の例の動作ができない
ssssa

2018/09/22 17:51

asahina1979様アドバイスありがとうございます。参考にさせていただきます。
ssssa

2018/09/22 17:53

swordone様:ご教示ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問