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

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

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

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

Q&A

解決済

1回答

523閲覧

ArrayListに入っている数字をremoveで削除する方法

nejirin_boy

総合スコア21

Java

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

0グッド

1クリップ

投稿2018/01/04 17:32

###前提・実現したいこと
コマンドプロンプト上で動くToDoリストを作っています。
登録した予定を削除する機能を実装中に以下のエラーメッセージが発生しました。

改善策をご享受お願い致します。

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

sort14.java:107: エラー: シンボルを見つけられません ToDoList[i].remove(ToDo.indexOf(str2)); ^ シンボル: 変数 i 場所: クラス sort14 sort14.java:107: エラー: シンボルを見つけられません ToDoList[i].remove(ToDo.indexOf(str2)); ^ シンボル: メソッド remove(int) 場所: クラス ToDo エラー2個

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

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 str2 = br.readLine(); 107 ToDoList.remove(ToDo.indexOf(str2)); 108 109 System.out.println("予定が削除されました。"); 110 } 111 } 112 } 113}

###試したこと
ToDoList.remove(ToDo.indexOf(str2));の行を何度か書き換えて試しましたが成功しませんでした。
###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

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

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

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

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

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

guest

回答1

0

ベストアンサー

removeメソッドを実行するのは、「ToDoList」ではなく「ToDo」ではないでしょうか?
配列にはremoveメソッドは無いと思います・・・。

投稿2018/01/04 17:57

rinchu_17

総合スコア24

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

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

nejirin_boy

2018/01/04 18:11

回答ありがとうございます。 ToDoに書き換えたところ、コンパイル通りました。ありがとうございます。 もう一点教えていただきたいことがありまして、キーボードから入力した値をremoveに反映させる方法を教えていただけないでしょうか?
rinchu_17

2018/01/04 18:38

自分はコマンドプロンプト上で動くプログラムを全くと言っていいほど書いたことがないので、詳しいことは他の方に聞くかネットで調べた方がいいとは思いますが、気になったことだけ述べさせていただきますね。 ToDo.remove(ToDo.indexOf(str2)); この文についてですが、indexOf()の引数はToDo型のオブジェクトでなければならないはずです。 というのも、ToDo(リスト)はToDoオブジェクトをいくつも格納しているもので、indexOfメソッドは「リストが持ってるこのToDoオブジェクトがリストの中で何番目なのか教えてくれ」っていう命令なので、『このToDoオブジェクト』に該当する引数を渡さないといけないはずです。コンパイルは通るんですかね?そのへんはわからないですが。 それで今のコードを見てみると、indexOfの引数にString型の変数を渡しているので正しく動かないのだと思います。 解決法としては、コマンドプロンプトで入力された番号をもとにあらかじめToDoオブジェクトを特定しておいて、それをindexOfにぶち込む、といった感じでしょうか。 今ケータイから打っているので具体的なコードは割愛しますが、もし必要でしたら気軽に言ってください。微力ながらお手伝いします。
退会済みユーザー

退会済みユーザー

2018/01/04 21:39

すでにコードの中で行われているように、入力値をintに変換し、そこから1を引いてremove(int)に渡してやればよいです。indexOfは不要ですね。 なぜ、1を引くかは、一覧表示のとき1を足して表示しているからです。 あと、入力値のエラー判定(例えば範囲外の数値を入れられたとか)が大事です。 また削除のような重要な処理では、あとで復活させることができませんから、削除前に確認を促すなどがあったほうがよいでしょう。
rinchu_17

2018/01/04 23:37

なるほど、たしかにそうですね。 indexOfの引数に気を取られて気付きませんでした。笑 ただ、質問者様のコード内のコメントを見た限りだと、おそらく「月順ないし優先度順で表示させたあとに、その表示順の番号を渡して削除」ということだと思いますので(違ったら申し訳ないですが)、月順または優先度順で表示させた際に別のToDo型リストか配列として保持しておいて、そのリストから与えられた番号-1のオブジェクトをget、それと同一のオブジェクトをindexOfに・・・とか色々考えたんですが、参照型云々で出来ないのかな~と。 もしくは月順優先度順表示の際に、ToDoリストのインデックスを表示順にint配列として保持しておくかですかね。 自分も経験が浅いのでこういうケースの最適解がわからないので教えていただければと!
nejirin_boy

2018/01/09 02:50

ベストアンサーにさせていただきました。 遅くなってしまい申し訳ありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問