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

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

ただいまの
回答率

90.87%

  • Java

    12798questions

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

removeが反映されない。

解決済

回答 5

投稿

  • 評価
  • クリップ 0
  • VIEW 290

nejirin_boy

score 15

前提・実現したいこと

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

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

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

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

エラーメッセージ

該当のソースコード

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.io.*;
import java.util.Comparator;

class ToDo{
    int month;
    int day;
    String item;
    int priority;
}

class sort14
{
    public static void main(String[] args)throws IOException
    {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    ToDo[] ToDoList = new ToDo[100]; //配列の宣言

    //ArrayListに変換
    ArrayList<ToDo> ToDo = new ArrayList<ToDo>(Arrays.asList(ToDoList));//<>の中にToDoを入れる(ToDoListはToDo型の配列であるため)

    for(int i = 0; i < ToDo.size(); i++){
        ToDoList[i] = new ToDo();
    }

    int num_items = 0;

    while(true){
        System.out.println("予定を追加するなら1を入力。予定を月順で表示するなら2、優先度順で表示するなら3を入力。予定の削除をするなら4を入力");

        String str = br.readLine();
        int num = Integer.parseInt(str);

        if(num == 1){
        do{
            System.out.println("月を入力して下さい(1〜12)");

            String month = br.readLine();
            ToDoList[num_items].month = Integer.parseInt(month);

        }while(!(1 <= ToDoList[num_items].month && ToDoList[num_items].month <= 12));

        do{
            System.out.println("日を入力して下さい(1〜31)");

            String day = br.readLine();
            ToDoList[num_items].day = Integer.parseInt(day);

        }while(!(1 <= ToDoList[num_items].day && ToDoList[num_items].day <= 31));        

        System.out.println("予定");

        String item = br.readLine();
        ToDoList[num_items].item = item;


        do{
        System.out.println("優先度を入力して下さい(1〜5)");

        String priority = br.readLine();
        ToDoList[num_items].priority = Integer.parseInt(priority);

        }while(!(1 <= ToDoList[num_items].priority && ToDoList[num_items].priority <= 5));

        num_items++;
        }
        else if(num == 2){
        System.out.println("予定です。(月昇順)");

        Arrays.sort(ToDoList , 0, num_items, new Comparator<ToDo>(){
            public int compare(ToDo todo1, ToDo todo2){
                if(todo1.month < todo2.month){
                    return -1;
                }
                else if(todo1.month == todo2.month){
                if(todo1.day <= todo2.day){
                    return -1;
                }
                else{
                    return 1;
                }
                }
                else{
                return 1;
                }
            }});

        for(int i = 0; i < num_items; i++){
            System.out.println(i+1  +". "+ ToDoList[i].month + "月" + ToDoList[i].day + "日 " + ToDoList[i].item + " 優先度:" + ToDoList[i].priority); // 昇順になる
        }
        }
        else if(num == 3){
        System.out.println("予定です。(優先度昇順)");
        Arrays.sort(ToDoList , 0, num_items, (a, b)->a.priority - b.priority);

        for(int i = 0; i < num_items; i++){
            System.out.println(i+1 + ". " + ToDoList[i].month + "月" + ToDoList[i].day + "日 " + ToDoList[i].item + " 優先度:" + ToDoList[i].priority); // 昇順になる
        }
        }
        else if(num == 4){
        System.out.println("削除したい予定の番号を入力して下さい。(月順の場合)");

        String remove1 = br.readLine();    
        ToDo.remove(Integer.parseInt(remove1)-1);//-1する 削除されない

        System.out.println("予定が削除されました。");

        Arrays.sort(ToDoList , 0, num_items, new Comparator<ToDo>(){
            public int compare(ToDo todo1, ToDo todo2){
                if(todo1.month < todo2.month){
                    return -1;
                }
                else if(todo1.month == todo2.month){
                if(todo1.day <= todo2.day){
                    return -1;
                }
                else{
                    return 1;
                }
                }
                else{
                return 1;
                }
            }});
        for(int i = 0; i < num_items; i++){
            System.out.println(i+1  +". "+ ToDoList[i].month + "月" + ToDoList[i].day + "日 " + ToDoList[i].item + " 優先度:" + ToDoList[i].priority); // 昇順になる
        }
        }
    }
    }
}

試したこと

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

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

より詳細な情報

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • swordone

    2018/01/09 14:43

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

    キャンセル

回答 5

checkベストアンサー

+2

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

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

    ToDo[] ToDoList = new ToDo[100]; //配列の宣言

    //ArrayListに変換
    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か所のみ)
イメージ説明
イメージ説明

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/11 13:43

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

    キャンセル

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:
uniquedelete した場合でもぬるぽになるだけで、要素数までは変わらない可能性。

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

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

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

C++だと

[](引数){処理}

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

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

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

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

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

かなと。

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

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

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

( 某 知○袋では多い。 )

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/11 13:43

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

    キャンセル

0

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

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

3,public static void main(String[] args)メソッドの中で処理を行いすぎです。

  1. 予定を追加
  2. 予定を月順で表示
  3. 予定を優先度順で表示
  4. 予定の削除

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/11 13:23

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

    キャンセル

  • 2018/01/11 13:25

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

    キャンセル

-1

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

IDEの導入を推奨します

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/11 13:43

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

    キャンセル

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

  • ただいまの回答率 90.87%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    社員情報のプログラム

    社員情報のプログラム (JAVA) プログラの機能 (1)社員情報の追加 入力項目としては、社員番号、氏名(性、名)、生年月日(年、月、日) (3)で読み込んだ情報を追加する仕

  • 解決済

    くじの当選番号のプログラム

    手順 ①当選番号を6つ入力する ②自分が買った券の枚数を入力 ③自分が買った券の番号を入力(6つ) ④それぞれの自分の勝った券がどれくらいあたっているか出力 入力例

  • 解決済

    100になる直前の加算結果出力

    javaで開始値と終了値を入力してその間の偶数を加算していき、合計が100を超えたら「数値が100を超えたため、処理を中止します。」とメッセージを出し、かつ合計が100になる前の加

  • 受付中

    計算機の機能追加に関する質問

    javaで計算機のプログラムを作成しました。 単項マイナス演算(例、-10+5)を行う処理を追加したいのですが 修正方法がわかりません。 どのように修正したらよいでしょうか?

  • 解決済

    Javaもしくは、openoffice calcを用いて様々な文字列を数値に変換したい

    Javaについての質問です。 このようなテキストファイルがあるとします userID           venueID     star g;ajgfadjfajk

  • 解決済

    ファイルの書き出し

    前提・実現したいこと csvファイルから読み込んだものをソートして別のcsvファイルに書き出しを行いたいです。 発生している問題・エラーメッセージ 書き出しが行われない。

同じタグがついた質問を見る

  • Java

    12798questions

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