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

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

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

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

Q&A

解決済

5回答

1527閲覧

removeが反映されない。

nejirin_boy

総合スコア21

Java

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

0グッド

0クリップ

投稿2018/01/09 04:04

###前提・実現したいこと
キーボードから月日、予定、優先度を入力して表示するToDoリストを作っています。
配列をArrayListに変換し、入力した予定を削除プログラムをしようとしたところでエラーが発生しました。

改善策をご享受ください。

###発生している問題・エラーメッセージ
エラーメッセージは表示されず、コンパイルは通ります。
削除したい予定の番号を入力しても、反映されないです。

エラーメッセージ

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

Java

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

###試したこと
num_itemsをToDo.sizeに書き換えましたが、エラーは改善されませんでした。

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

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

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

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

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

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

swordone

2018/01/09 05:43

エラーメッセージがないのにエラーが発生したと判断している理由は何でしょうか。
guest

回答5

0

ベストアンサー

まず大前提として…
変数名は小文字始まりで書いてください。
クラス名のToDoと変数名のToDoが共存していて読みにくいことこの上ないです。
それでなくても習慣としてクラス名は大文字始まり、変数名は小文字始まりで書いてください。

さて、いろいろおかしいので突っ込んでいきます。

java

1 ToDo[] ToDoList = new ToDo[100]; //配列の宣言 2 3 //ArrayListに変換 4 ArrayList<ToDo> ToDo = new ArrayList<ToDo>(Arrays.asList(ToDoList));//<>の中にToDoを入れる(ToDoListはToDo型の配列であるため)

これも混乱の元ですね。配列なのに変数名にListが入っているし、さらに本当のArrayListが別にあるしで。

それはさておき、ToDoListとToDoで内容は共有していないことに注意してください。
問題のremove以外で、ToDoのリストToDoを触っている場所が一か所もありません。
それ以外は配列のToDoListをいじっているだけで、ToDoはノータッチです。
つまり、ToDoには最初から最後まで変化しません。最初の時点でnullが100個入っているだけです。
removeではこのnullのうち一つが削除されますが、結局表示しているのは配列の情報なので影響がないというだけの話です。

参考
コードをEclipseに突っ込んで変数ToDoをハイライト(宣言部を含めて3か所のみ)
イメージ説明
イメージ説明

投稿2018/01/09 15:33

編集2018/01/09 18:46
swordone

総合スコア20649

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

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

0

ArrayListであるToDoを使っていたり、ToDo[]であるToDoListを使っていたり。
どちらか一方にしないと正常な動作は期待できないでしょう。

今回の場合は前者に統一すべきかと。

投稿2018/01/09 04:22

LouiS0616

総合スコア35660

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

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

nejirin_boy

2018/01/11 04:43

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

0

Eclipseにコードをコピペしてみたら大量の警告が出ました(実行自体はできましたが)

IDEの導入を推奨します

投稿2018/01/09 16:06

yuyabu

総合スコア63

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

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

nejirin_boy

2018/01/11 04:43

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

0

1,月順または優先度順にソートしていますが、ソートだとArrayList内部の順番が変わります。
予定を登録時にlong型のidを振って、削除時はidを元に削除するという形にしたほうが、ブレがないです。

2,以前質問者様が質問されたこの質問do〜while文の複数条件を適用させたいにて、
改善ソースコードとして配列からArrayListに変更したソースコードを記述したのですが、
目を通していらっしゃらなかったりしちゃいますか?

3,public static void main(String[] args)メソッドの中で処理を行いすぎです。
0. 予定を追加
0. 予定を月順で表示
0. 予定を優先度順で表示
0. 予定の削除

の4つのメソッドに分けたほうが各処理の影響範囲が少なくなるのでよいと思います。
自分で書いたソースコードを管理できなくなる前に対策することをお勧めいたします。

投稿2018/01/09 08:19

編集2018/01/09 15:48
umyu

総合スコア5846

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

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

nejirin_boy

2018/01/11 04:23

回答ありがとうございます。 以前改善していただいたソースコードは拝見いたしましたが、自分で考えたものを使おうと思っておりましたのでそのままにしていました。
nejirin_boy

2018/01/11 04:25

ですが、自分で考えていたものがわからなくなってきていますので、 今後はumyu様に改善していただいたソースコードを参考にさせていただきます。
guest

0

私は趣味でC++やっています。
Javaはあまりわかりませんが。

可能性として挙げるとすると、


エラーってどのようなエラーでしょうか?

もしかしてクラッシュするとか?

ソースコード読んでいないのでわかりませんが、もしかしたら例外が飛んできた可能性もありますね。

例えば要素数10しかないのに 要素番号100 にアクセスしようとしたとか。

その場合は例外処理を設ければいいはず。

それで、例外が飛んできた場合の処理に移ったら例外が飛んでいる証拠。

そうじゃないなら...どうでしょうね。

可能性1: 例外が飛んできたが補足( catch ) していないため強制終了

後は、C++でstd::vector ( Vector に相当? ) をunique したりする場合、その部分が残ったままになります。

vec[0] = データ1 vec[1] = データ2 vec[2] = NULL vec[3] = データ3

みたいな感じで。

これみたいになっているかもしれない。

可能性2: unique や delete した場合でもぬるぽになるだけで、要素数までは変わらない可能性。

さらに可能性2が深まって、ぬるぽなのに動かそうとしたとかでクラッシュ。

可能性3: 可能性2により、ぬるぽ状態だがそのまま動かそうとしたため例外が投げられているが、補足していないためクラッシュ

後は、ぱっと読んでいて、sortメソッドに ラムダ式っていうのでしょうか?

C++だと

C++

1[](引数){処理}

でやるやつを渡しているようですね。

C++の場合は[] の中に「参照であり、書き換えが可能である」みたいな明示が必要です。

それを行わないと変更ができないっていう場合がありますから。

Javaだと違うかもしれませんが。

可能性4: ラムダ式の仕様によるもの

かなと。

ほかの可能性もありますが、今思いつくだけではこれだけ。

「エラーが出た」じゃなくてどういうエラーか明示したほうがいいです。

人によっては実行結果が違う場合も「エラーが出た」と表現する人いますからね。

( 某 知○袋では多い。 )

投稿2018/01/09 04:36

BeatStar

総合スコア4958

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

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

nejirin_boy

2018/01/11 04:43

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問