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

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

ただいまの
回答率

90.52%

  • Java

    13766questions

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

  • Eclipse

    1657questions

    Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

テキストファイルのデータをArrayListに格納したい

解決済

回答 1

投稿

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

oka12

score 2

 前提・実現したいこと

EclipseのJavaを使用し、学生情報管理システムを作っています。
Eclipseで入力した情報をローカルのテキストファイル
に保存したうえ、ファイルのデータの取出しをしたいと思っています。

仮想上に格納するツールとしてArrayListを使っているのですが、現状学生情報の検索をしたり
削除をするときにArrayListから該当するデータを探しているので、テキストファイルの情報と食い違いが生じます。その食い違いをなくし、なんとかArrayListの情報とテキストファイルの情報を同期したいです。

 該当のソースコード

Java
ソースコード
import java.io.*;
import java.util.ArrayList;


public class Student2 {

     public String id ;
     public String name ;
     public String birth ;
     public String address ;


     //コンストラクタ
     public Student2 (String id, String name, String birth, String address){

        this.id = id;
        this.name = name;
        this.birth = birth;
        this.address = address;
    }


    //オブジェクトの値を取得
    public String getId() {
        return this.id;
    }
    public String getName() {
        return this.name;
    }
    public String getBirth() {
        return this.birth;
    }
    public String getAddress() {
        return this.address;
    }


    //オブジェクトの値をセット
    public void setId(String id) {
        this.id = id;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void setBirth(String birth) {
        this.birth = birth;
    }
    public void setAddress(String address) {
        this.address = address;
    }

    //オブジェクト型をString型に変換
    public String toString(){
        return id + name + birth + address;
    }




    public static void main(String[] args) {


        Student2 st;


        //Studentリストの作成
        ArrayList<Student2> list = new ArrayList<Student2>();

        //ファイルクラスの作成
        File file = new File("C:\\Users\\REALSYS-0132\\Desktop\\タスク\\タスク2\\st.txt");



        BufferedReader reader = new BufferedReader(new InputStreamReader(
                    System.in));

        String line;

        boolean quit = false;


        try {

        while (!quit) {

            //メニュー選択
            System.out.println("◆メニュー番号を選択してください。");
            System.out.println("----------------------------------------------------");
            System.out.println("1.学生情報新規登録 (*)");
            System.out.println("2.学生情報検索 (*)");
            System.out.println("3.学生情報削除");
            System.out.println("4.学生情報更新");
            System.out.println("5.閉じる (*)");
            System.out.println("----------------------------------------------------");

            line = reader.readLine();

            int n = Integer.parseInt(line);

            switch(n) {

            case 1 :
                // 1.登録



                    System.out.println("■IDを入力して下さい。");
                    String id = reader.readLine();

                    System.out.println("■氏名を入力して下さい。");
                    String name = reader.readLine();

                    System.out.println("■生年月日を入力して下さい。");
                    String birth = reader.readLine();

                    System.out.println("■住所を入力してください。");
                    String address = reader.readLine();


                    //Studentオブジェクトの作成

                    st = new Student2(id, name, birth, address);


                    //listへ値を追加
                    list.add(st);

                    //ファイルへ値を追加
                    PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file)));

                    for (Student2 result : list) {
                         pw.println(result);
                    }

                    pw.close();




                    System.out.println("");
                    System.out.println(list.size() + "人を登録しました。");
                    System.out.println("下記の人物が登録されています。");
                    System.out.println("");
                    System.out.println("-----------------------");

                    for (int i = 0; i < list.size(); i++) {

                        //ID表示
                        System.out.println("ID: " + list.get(i).getId());

                        //名前表示
                        System.out.println("名前: " + list.get(i).getName());

                        //生年月日表示
                        System.out.println("生年月日: " + list.get(i).getBirth());

                        //住所表示
                        System.out.println("住所: " + list.get(i).getAddress());

                    }
                    System.out.println("-----------------------");
                    System.out.println("");
            break;

            case 2 :

                    // 2.検索

                     FileReader fr = new FileReader(file);
                     BufferedReader br = new BufferedReader(fr);

                     String data = br.readLine();



                    System.out.println("表示したい学生の氏名を入力してください。");

                    String input= reader.readLine();


                    boolean ex = false;

                    for (int i = 0; i < list.size(); i++) {


                        if(input.equals(list.get(i).getName())) {

                            //ID表示
                            System.out.println("ID: " + list.get(i).getId());

                            //名前表示
                            System.out.println("名前: " + list.get(i).getName());

                            //生年月日表示
                            System.out.println("生年月日: " + list.get(i).getBirth());

                            //住所表示
                            System.out.println("住所: " + list.get(i).getAddress());

                        ex = true;

                        }

                    }
                    if (ex == false) {
                        System.out.println("該当するデータはありません。");
                    }






            break;

            case 3 :

                    // 3.削除

                        System.out.println("削除したい学生の氏名を入力してください。");

                        String input2= reader.readLine();
                        boolean ex2 = false;

                        for (int i = 0; i < list.size(); i++) {

                            if (input2.equals(list.get(i).getName())) {

                                list.remove(list.get(i));


                                System.out.println("該当データを削除しました。");

                                //リストの削除をファイルにも反映
                                 PrintWriter pw2 = new PrintWriter(new BufferedWriter(new FileWriter(file)));

                                     for (Student2 result : list) {
                                             pw2.println(result);
                                     }

                                     pw2.close();

                            ex2 = true;
                            }

                        }
                        if (ex2 == false) {
                            System.out.println("該当するデータはありません。");
                        }

                         System.out.println("");
                         System.out.println(list.size() + "人を登録済みです。");

                         System.out.println("下記の人物が登録されています。");
                         System.out.println("----------------------");


                         for (int  i = 0; i < list.size(); i++) {

                            //ID表示
                            System.out.println("ID: " + list.get(i).getId());

                            //名前表示
                            System.out.println("名前: " + list.get(i).getName());

                            //生年月日表示
                            System.out.println("生年月日: " + list.get(i).getBirth());

                            //住所表示
                            System.out.println("住所: " + list.get(i).getAddress());

                         }
                         System.out.println("----------------------");
            break;

            case 4 :
                    // 4.更新

                        System.out.println("更新したい学生のIDを入力してください。");

                        String input3= reader.readLine();
                        boolean ex3 = false;

                        for (int i = 0; i < list.size(); i++) {

                            if (input3.equals(list.get(i).getId())) {

                                System.out.println("データの更新をします");
                                System.out.println("");

                                System.out.println("■IDを入力して下さい。");
                                id = reader.readLine();


                                System.out.println("■氏名を入力して下さい。");
                                name = reader.readLine();

                                System.out.println("■生年月日を入力して下さい。");
                                birth = reader.readLine();

                                System.out.println("■住所を入力してください。");
                                address = reader.readLine();

                                list.get(i).setId(id);;
                                list.get(i).setName(name);
                                list.get(i).setBirth(birth);
                                list.get(i).setAddress(address);

                                //リストの削除をファイルにも反映
                                 PrintWriter pw3 = new PrintWriter(new BufferedWriter(new FileWriter(file)));

                                 for(Student2 result : list){
                                        pw3.println(result);
                                    }


                                 pw3.close();


                            ex3 = true;

                            }


                        }
                        if (ex3 == false) {
                            System.out.println("該当するデータはありません。");
                        }

                         System.out.println("");
                         System.out.println(list.size() + "人を登録済みです。");

                         System.out.println("下記の人物が登録されています。");
                         System.out.println("----------------------");


                         for (int  i = 0; i < list.size(); i++) {

                             //ID表示
                             System.out.println("ID: " + list.get(i).getId());

                            //名前表示
                            System.out.println("名前: " + list.get(i).getName());

                            //生年月日表示
                            System.out.println("生年月日: " + list.get(i).getBirth());

                            //住所表示
                            System.out.println("住所: " + list.get(i).getAddress());

                         }
                         System.out.println("----------------------");

            break;

            case 5 :
                    // 5.終了

                quit = true;

            break;

            default :

                    System.out.println("1~5の間の番号を入力して下さい。");
            break;
            }
        }
        }catch (IOException e) {
            System.out.println(e);
         }



    }









}

 試したこと

現状ToStringを使用することで、入力したデータをリストに格納し、それをファイルに書き込むまでは
うまくいっているのですが、逆にテキストファイルの内容をArrayListに反映させる方法が分からないです。具体的には、FileReader、BufferedReaderクラスで読み取ったデータのデータ型はString型なのに、ListはStudent2型なのでその変換方法が不明です(あればですが…)。

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

Eclipse(Neon.3 Release(4.6.3))

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • root_jp

    2018/04/17 17:41

    テキストファイルにはどういった内容が出力されますか?

    キャンセル

  • oka12

    2018/04/17 17:56

    「1佐藤19990203東京」みたいな感じで出力されます。

    キャンセル

回答 1

checkベストアンサー

+2

1佐藤19990203東京のように出力してしまうと
ファイルから読み込む時にどこからどこまでがidでどこからどこまでがnameなのか分からないので、
何らかの文字で区切って出力するなどにすべきだと思います。
しかしそうしたらそうしたらで、区切り文字をidやnameで入力されてしまうと
正しい区切り位置が分からなくなるので、工夫が必要になってきますが、
とりあえずその辺りの話しは置いておいて、
カンマで区切られた1,佐藤,19990203,東京という内容をStudent2にしてみます。

カンマで区切って出力するにはtoString()を以下のようにすればよいでしょう。

public String toString(){
    return String.join(",", id, name, birth, address);
}

ファイルは以下とします。

1,佐藤,19990203,東京
2,鈴木,19950405,大阪
Path filePath = Paths.get("C:\\Users\\REALSYS-0132\\Desktop\\タスク\\タスク2\\st.txt");
try (Stream<String> lines = Files.lines(filePath)) {
    List<Student2> student2List = lines.map(line -> {
        String[] cols = line.split(",");
        return new Student2(cols[0], cols[1], cols[2], cols[3]);
    }).collect(Collectors.toList());
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/17 18:29

    ありがとうございます!
    そのコードで試してみます!

    キャンセル

  • 2018/04/18 17:08

    Streamやmap使うの初めてだったんですけど、listを全部Student2Listに置き換えることでうまくいきました!ありがとうございました!

    キャンセル

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

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

関連した質問

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

  • Java

    13766questions

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

  • Eclipse

    1657questions

    Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。