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

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

ただいまの
回答率

90.48%

  • Java

    14126questions

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

  • Eclipse

    1710questions

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

  • ArrayList

    94questions

    Java用のタグです。arrayListはListインターフェースを実装した、リサイズ可能な配列用クラスです。

多次元リストの検索、要素の取り出しについて

解決済

回答 3

投稿

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

friday_13

score 2

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

class ArrayTest
{
    public static void main(String[] args) throws IOException
    {
        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("----------------------------------------------------");

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

            System.out.println("番号を選択してください。");
            String str = br.readLine();
            int res = Integer.parseInt(str);

            switch(res) {
            case 1:InputT.input();
                main(args);
                break;
            case 2:SearchT.search();
                main(args);
                break;
            case 3:DeleteT.delete();
                main(args);
                break;
            case 4:/*Updata.updata();*/
                main(args);
                break;
            case 5:
                System.out.println("終了します。");
                System.exit(0);
                break;
            default:
                System.out.println("入力された番号に該当するメニューがありません。");
                main(args);
                break;
            }
    }
}

//リストの作成
class SL{
    static ArrayList listall;
    static ArrayList list;

    // 多次元リストの宣言
    static ArrayList<ArrayList<String>> person = new ArrayList<ArrayList<String>>();

    public static void create() throws IOException {
        ArrayList<String> ps = new ArrayList<>(4);
        String id = "ID";
        String name = "NAME";
        String birth = "BIRTHDAY";
        String adr = "ADDRESS";

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

        for(int i = 0; i < 1; i++) {
        System.out.println("IDを入力してください。");
        id = br.readLine();
        ps.add(id);
        System.out.println("\n名前を入力してください。");
        name = br.readLine();
        ps.add(name);
        System.out.println("\n生年月日を入力してください。(例:XXXX/XX/XX)");
        birth = br.readLine();
        ps.add(birth);
        System.out.println("\n住所を入力してください。");
        adr = br.readLine();
        ps.add(adr);
        }

        person.add(ps);

        listall = person;
        list = ps;
    }

    public ArrayList getlist1() {

        SL sl = new SL();
        return sl.listall;
    }
    public ArrayList getlist2() {

        SL sl = new SL();
        return sl.list;
    }
}

//登録
class InputT{

    static void input() throws IOException {

        //学生情報
            System.out.println("\n学生情報の登録をします。");
            SL sl = new SL();

            SL.create();

            ArrayList listZ = sl.getlist2();

            System.out.println("\n\n" + listZ);
            System.out.println("\n" + listZ.get(1) + "さんの情報を登録しました。\n");

    }
}

//検索
class SearchT{
    static void search() throws IOException {

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

        SL b = new SL();
        ArrayList listX = b.getlist1();
        ArrayList listZ = b.getlist2();

            System.out.println("検索する文字列を選択してください。");
            String moji = br.readLine();

            try{

                System.out.println(((ArrayList) listX.get(0)).get(1));
                System.out.println(moji + "のインデックスは" + listX.indexOf(moji) + "です。");
                System.out.println(listX);
                System.out.println(listZ);
                System.out.println("要素数 = " + listX.size());
                for(Object s:listX) {
                    System.out.println(s);
                }
            }
            catch(java.lang.NullPointerException e){
                System.out.println("入力した文字列は登録されていません。");
                System.out.println("メニューに戻ります。");
            }
    }
}

//削除
class DeleteT{
    static void delete() throws IOException {
        BufferedReader br =
                new BufferedReader(new InputStreamReader(System.in));

        SL b = new SL();
        ArrayList listX = b.getlist1();
        ArrayList listZ = b.getlist2();

            System.out.println("削除する文字列を選択してください。");
            String moji = br.readLine();

            try{
                if (listZ.contains(moji));
                listZ.remove(moji);
                System.out.println(moji + "を削除しました。");
                System.out.println(listX);
            }
            catch(java.lang.NullPointerException e){
                System.out.println("入力した文字列は登録されていません。");
                System.out.println("メニューに戻ります。");
            }
    }
}

/*//更新
class Updata{
    static void updata() throws IOException {

}*/


Javaを勉強中の者です。
上記ソースでキーボードから値を受け入れる形式の多次元リストを制作しているのですが、格納した値を検索または削除する際、あらかじめpersonリストの中に格納しておいた複数のpsリストのインデックスが一部で最後に格納した値の物以外破棄されてしまっているようです。
具体例を挙げますと、あらかじめpsリストに[11,22,33,44]、[55,66,77,88]と値を格納し、それをさらにpersonリストにまとめて格納しています。この時点でpersonリストを出力すると[[11,22,33,44],[55,66,77,88]]となっています。
その後、indexOfで22のインデックスを調べるとperson、psリストのどちらからも-1、つまり格納されていないと返ってきます。しかし、personリストにget(0).get(1)で要素の取得をさせるとちゃんと22が返ってきます。
この場合、古い方([11,22,33,44])のインデックスを保持したままにして検索、削除が出来るようにするにはどこを修正すればよいのでしょうか。アドバイスの方お願い致します。

開発環境:Eclipse 4.7 Oxygen 3a(32bit版 Full Edition)

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

+1

indexOfで22のインデックスを調べるとperson、psリストのどちらからも-1、つまり格納されていないと返ってきます。

System.out.println(((ArrayList) listX.get(0)).get(1));
System.out.println(moji + "のインデックスは" + listX.indexOf(moji) + "です。");

↑listXは「ArrayList<ArrayList<String>>」でしょ?
「ArrayList<ArrayList<String>>」に「indexOf(String)」かけてもそりゃ見つかりませんよ。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/06/18 14:35

    ご指摘ありがとうございます。アイコンのハス太くんかわいいですね。
    Javaに関しては浅学の身であり恥ずかしながら多次元リストの要素の取り出し方すらteratail様などで調べつつ入れている有様ですので、できれば改善案も併せてお教えいただけると助かります。キャストすれば解決するのでしょうか。

    キャンセル

  • 2018/06/18 14:39

    > キャストすれば解決
    ↑単なるキャストでは解決しません。
    「((ArrayList) listX.get(0)).indexOf(moji)」ならArrayList<String>にindexOfしていることになります。

    キャンセル

  • 2018/06/18 14:46

    重ねてお礼申し上げます。参考にさせて頂きます。

    キャンセル

+1

listallは常にpersonと同じリスト(「StringのArrayList」のArrayList)を参照し、listはcreate()のたびに最後に入力した人物データのリストで上書きされます。
結果、search()でやってることは、対象の文字列を、

  • listall,つまり「StringのArrayList」のArrayListから探す
  • list,つまり最後に入力された人物データから探す

ということをすることになります。
前者は、対象の文字列と一致する「StringのArrayList」を探すことになり、絶対に見つかりません。文字列とリストは違うものなので。
後者は、最後のデータしか探せないため、最初の人物データは当然探せません。

 改善方法

前述の通り、listallとpersonは同じ参照なので、どちらかを消します。例えばpersonを消した場合、personにアクセスするコードは全てエラーになるので、listallに書き換えます。
未加工型を使うのもやめましょう。listallはArrayList<ArrayList<String>>,listはArrayList<String>で宣言します。
そして、listallからArrayListを一つずつ取り出して、それぞれに対してindexOfを使う、というのが最低限の使い方になります。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/06/18 17:34

    ご回答ありがとうございます。参考にして改修してみます。

    キャンセル

checkベストアンサー

0

註: 『どのように解決するべきか』に主眼を置いた回答です。

今のコードをそのまま拡張すると非常にこんがらがったコードになります。
まずは、生徒の情報を管理するクラスを作ってはいかがでしょうか。

public class StudentInfo {
    private String name;
    private String birth;  // 文字列じゃない方が扱いやすいかも
    private String address;

    public StudentInfo(String name, String birth, String address) {
        this.name    = name;
        this.birth   = birth;
        this.address = address;
    }
}

そして、idと生徒情報をハッシュマップで結び付けます。

Map<Integer, Student> map = new HashMap<>();
map.put(1, new Student("Yamada", "2000/1/1", "Tokyo"));

このようにしておけば、Mapの機能を利用できるので種々の実装が一気に楽になります。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/06/18 13:02

    ご回答ありがとうございます。Mapを使ったことがなかったので調べながらの質問になってしまうのですが、教えて頂いた
    Map<Integer, Student> map = new HashMap<>();
    map.put(1, new Student("Yamada", "2000/1/1", "Tokyo"));
    の部分はpsリストを作っている部分をMapに作り替える形であってますでしょうか?

    キャンセル

  • 2018/06/18 13:46

    そのとおりです。

    キャンセル

  • 2018/06/18 14:36

    重ねてお礼申し上げます。頂いたご意見を参考に改修してみます。

    キャンセル

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

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

関連した質問

  • 受付中

    10進数から16進数に変換

    10進数を入力すれば16進数に変換されるというプログラムを作っているのですがいまいちうまくいきませんどこがまちがっているのでしょうか? import java.io.IOExce

  • 受付中

    社員情報のプログラム

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

  • 受付中

    Javaの質問です。テキストファイルのデータを上書き(部分的に削除)したいです。お力をお貸しください...

    初めて利用させていただきます。 現在私は、テキストファイルを用いるJavaの勉強をしております。 テキストファイルに、コンソールで入力した「name」「job」「sex」を

  • 解決済

    Java if文を多様しないで組みたい

    現在Javaにて名前と科目を入力したら登録した点数がでるプログラムを組んでいます。 エラーは無いのですがif文を多様してしまっているのでif文をあまり使わずに作りたいです。

  • 解決済

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

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

  • 受付中

    ENTER実行処理

    Enterキーを押して、次の処理に移るCUIを作りたいのですが、思うようにいきません。勇者の攻撃のあとと、HP、MP表示のあとEnter押すまで次の処理しないようにしたのですが、教

  • 解決済

    会員情報システム(Java)での作り方

    javaで会員情報システムのようなものを作りたいです。 下記の実行結果(コマンドプロンプトで実行)になるような、登録プログラムを作成したいのですが、作成方法が分かりませんので、教

  • 解決済

    [Java]AllyNameをNameInputでも使えるようにしたい

    package test; import java.io.BufferedReader; import java.io.IOException; import java.io.In

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

  • Java

    14126questions

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

  • Eclipse

    1710questions

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

  • ArrayList

    94questions

    Java用のタグです。arrayListはListインターフェースを実装した、リサイズ可能な配列用クラスです。