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

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

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

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

Q&A

解決済

2回答

282閲覧

do〜while文の条件を適用させたい

nejirin_boy

総合スコア21

Java

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

1グッド

0クリップ

投稿2018/01/22 02:41

###前提・実現したいこと
Javaで入力した予定を追加・削除するプログラムを作っています。
削除する機能を実装中に問題が発生しました。

118行目のdo-while分の継続条件がうまく反映されません。
自分では予定を削除したいときに追加されている予定の数以外の数字を入力した時に
数字の再入力を求める様にしたいのですが、
予定の数以外の数字を入力すると、プログラムが終了してしまいます。

適用条件を他の変数に変えて試したのですが、うまくいきませんでした。

改善策を享受いただけないでしょうか?

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

予定削除の時に予定の数以外の数字を入力すると、以下の内容が表示されます。 Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 1, Size: 1 at java.util.ArrayList.rangeCheck(ArrayList.java:653) at java.util.ArrayList.remove(ArrayList.java:492) at sort24.main(sort24.java:117)

###該当のソースコード

Java

1import java.util.ArrayList; 2import java.util.List; 3import java.io.*; 4import java.util.Comparator; 5 6class ToDo{ 7 int month; 8 int day; 9 String item; 10 int priority; 11} 12 13class sort24 14{ 15 public static void main(String[] args)throws IOException 16 { 17 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 18 19 ArrayList<ToDo> todo = new ArrayList<ToDo>(); 20 21 while(true){ 22 23 System.out.println("予定を追加するなら1を入力。"); 24 System.out.println("予定を月順で表示するなら2を入力"); 25 System.out.println("予定を優先度順で表示するなら3を入力"); 26 System.out.println("予定を削除するなら4を入力"); 27 28 String str = br.readLine(); 29 int num = Integer.parseInt(str); 30 31 ToDo tmp = new ToDo(); 32 33 switch(num){ 34 case 1: 35 36 do{ 37 System.out.println("月を入力して下さい(1〜12)"); 38 39 String month = br.readLine(); 40 tmp.month = Integer.parseInt(month); 41 42 }while(!(1 <= tmp.month && tmp.month <= 12)); 43 44 do{ 45 System.out.println("日を入力して下さい(1〜31)"); 46 47 String day = br.readLine(); 48 tmp.day = Integer.parseInt(day); 49 50 }while(!(1 <= tmp.day && tmp.day <= 31)); 51 52 System.out.println("予定"); 53 54 String item = br.readLine(); 55 tmp.item = item; 56 57 do{ 58 System.out.println("優先度を入力して下さい(1〜5)"); 59 60 String priority = br.readLine(); 61 tmp.priority = Integer.parseInt(priority); 62 63 }while(!(1 <= tmp.priority && tmp.priority <= 5)); 64 65 System.out.println("予定が追加されました。"); 66 67 todo.add(tmp); 68 69 break; 70 71 case 2: 72 System.out.println("予定です。(月昇順)"); 73 74 todo.sort(new Comparator<ToDo>() { 75 76 public int compare(ToDo todo1, ToDo todo2) { 77 78 int month = Integer.compare(todo1.month, todo2.month); 79 80 if (month == 0) { 81 return Integer.compare(todo1.day, todo2.day); 82 } 83 else { 84 return month; 85 } 86 } 87 }); 88 89 System.out.println("=========="); 90 91 for(int i = 0; i < todo.size(); i++){ 92 System.out.println(i + 1 +". "+ todo.get(i).month + "月" + todo.get(i).day + "日 " + todo.get(i).item + " 優先度:" + todo.get(i).priority); // 昇順になる 93 } 94 95 System.out.println("=========="); 96 break; 97 98 case 3: 99 System.out.println("予定です。(優先度昇順)"); 100 101 todo.sort((a,b)-> a.priority - b.priority); 102 103 System.out.println("=========="); 104 105 for(int i = 0; i < todo.size(); i++){ 106 System.out.println(i + 1+". "+ todo.get(i).month + "月" + todo.get(i).day + "日 " + todo.get(i).item + " 優先度:" + todo.get(i).priority); // 昇順になる 107 } 108 109 System.out.println("=========="); 110 break; 111 112 case 4: 113 System.out.println("削除したい予定の番号を入力して下さい。(月順の場合)"); 114 115 do{ 116 String remove1 = br.readLine(); 117 todo.remove(Integer.parseInt(remove1)-1);//-1する 118 }while(!(1 <= todo.size()));//ここがうまくいかない。 119 120 System.out.println("予定が削除されました。"); 121 122 System.out.println("=========="); 123 124 for(int i = 0; i < todo.size(); i++){ 125 System.out.println(i + 1 +". "+ todo.get(i).month + "月" + todo.get(i).day + "日 " + todo.get(i).item + " 優先度:" + todo.get(i).priority); // 昇順になる 126 } 127 128 System.out.println("=========="); 129 break; 130 } 131 } 132 } 133}

###試したこと
継続条件の変数を色々変えて試しましたが、うまくいきませんでした。

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

swordone👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

そもそも入力したインデックスが予定リストの範囲外(リストサイズより大きい数値)の場合、removeで例外が発生してしまい、whileでは捕まえられません。
removeの前にその数値が正しいかをチェックする必要があります。

投稿2018/01/22 02:53

swordone

総合スコア20651

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

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

nejirin_boy

2018/01/23 04:45

ご回答ありがとうございました。
guest

0

do~whileだと処理後に判定されるため、whileを使った方がいいのではないでしょうか?

投稿2018/01/22 02:50

unz.hori

総合スコア1057

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

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

unz.hori

2018/01/22 03:00

まず、todoにデータが存在する場合、かつ指定されたindex値が正しい場合に削除を行うべきですね。
nejirin_boy

2018/01/23 04:46

ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問