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

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

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

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

Eclipse

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

ArrayList

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

Q&A

解決済

3回答

3367閲覧

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

friday_13

総合スコア8

Java

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

Eclipse

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

ArrayList

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

0グッド

1クリップ

投稿2018/06/18 02:43

Java

1import java.io.BufferedReader; 2import java.io.IOException; 3import java.io.InputStreamReader; 4import java.util.ArrayList; 5 6class ArrayTest 7{ 8 public static void main(String[] args) throws IOException 9 { 10 System.out.println("----------------------------------------------------"); 11 System.out.println("メインメニュー"); 12 System.out.println("1.学生情報新規登録 (*)"); 13 System.out.println("2.学生情報検索 (*)"); 14 System.out.println("3.学生情報削除"); 15 System.out.println("4.学生情報更新"); 16 System.out.println("5.閉じる (*)"); 17 System.out.println("----------------------------------------------------"); 18 19 BufferedReader br = 20 new BufferedReader(new InputStreamReader(System.in)); 21 22 System.out.println("番号を選択してください。"); 23 String str = br.readLine(); 24 int res = Integer.parseInt(str); 25 26 switch(res) { 27 case 1:InputT.input(); 28 main(args); 29 break; 30 case 2:SearchT.search(); 31 main(args); 32 break; 33 case 3:DeleteT.delete(); 34 main(args); 35 break; 36 case 4:/*Updata.updata();*/ 37 main(args); 38 break; 39 case 5: 40 System.out.println("終了します。"); 41 System.exit(0); 42 break; 43 default: 44 System.out.println("入力された番号に該当するメニューがありません。"); 45 main(args); 46 break; 47 } 48 } 49} 50 51//リストの作成 52class SL{ 53 static ArrayList listall; 54 static ArrayList list; 55 56 // 多次元リストの宣言 57 static ArrayList<ArrayList<String>> person = new ArrayList<ArrayList<String>>(); 58 59 public static void create() throws IOException { 60 ArrayList<String> ps = new ArrayList<>(4); 61 String id = "ID"; 62 String name = "NAME"; 63 String birth = "BIRTHDAY"; 64 String adr = "ADDRESS"; 65 66 BufferedReader br = 67 new BufferedReader(new InputStreamReader(System.in)); 68 69 for(int i = 0; i < 1; i++) { 70 System.out.println("IDを入力してください。"); 71 id = br.readLine(); 72 ps.add(id); 73 System.out.println("\n名前を入力してください。"); 74 name = br.readLine(); 75 ps.add(name); 76 System.out.println("\n生年月日を入力してください。(例:XXXX/XX/XX)"); 77 birth = br.readLine(); 78 ps.add(birth); 79 System.out.println("\n住所を入力してください。"); 80 adr = br.readLine(); 81 ps.add(adr); 82 } 83 84 person.add(ps); 85 86 listall = person; 87 list = ps; 88 } 89 90 public ArrayList getlist1() { 91 92 SL sl = new SL(); 93 return sl.listall; 94 } 95 public ArrayList getlist2() { 96 97 SL sl = new SL(); 98 return sl.list; 99 } 100} 101 102//登録 103class InputT{ 104 105 static void input() throws IOException { 106 107 //学生情報 108 System.out.println("\n学生情報の登録をします。"); 109 SL sl = new SL(); 110 111 SL.create(); 112 113 ArrayList listZ = sl.getlist2(); 114 115 System.out.println("\n\n" + listZ); 116 System.out.println("\n" + listZ.get(1) + "さんの情報を登録しました。\n"); 117 118 } 119} 120 121//検索 122class SearchT{ 123 static void search() throws IOException { 124 125 BufferedReader br = 126 new BufferedReader(new InputStreamReader(System.in)); 127 128 SL b = new SL(); 129 ArrayList listX = b.getlist1(); 130 ArrayList listZ = b.getlist2(); 131 132 System.out.println("検索する文字列を選択してください。"); 133 String moji = br.readLine(); 134 135 try{ 136 137 System.out.println(((ArrayList) listX.get(0)).get(1)); 138 System.out.println(moji + "のインデックスは" + listX.indexOf(moji) + "です。"); 139 System.out.println(listX); 140 System.out.println(listZ); 141 System.out.println("要素数 = " + listX.size()); 142 for(Object s:listX) { 143 System.out.println(s); 144 } 145 } 146 catch(java.lang.NullPointerException e){ 147 System.out.println("入力した文字列は登録されていません。"); 148 System.out.println("メニューに戻ります。"); 149 } 150 } 151} 152 153//削除 154class DeleteT{ 155 static void delete() throws IOException { 156 BufferedReader br = 157 new BufferedReader(new InputStreamReader(System.in)); 158 159 SL b = new SL(); 160 ArrayList listX = b.getlist1(); 161 ArrayList listZ = b.getlist2(); 162 163 System.out.println("削除する文字列を選択してください。"); 164 String moji = br.readLine(); 165 166 try{ 167 if (listZ.contains(moji)); 168 listZ.remove(moji); 169 System.out.println(moji + "を削除しました。"); 170 System.out.println(listX); 171 } 172 catch(java.lang.NullPointerException e){ 173 System.out.println("入力した文字列は登録されていません。"); 174 System.out.println("メニューに戻ります。"); 175 } 176 } 177} 178 179/*//更新 180class Updata{ 181 static void updata() throws IOException { 182 183}*/

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)

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

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

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

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

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

guest

回答3

0

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 08:16

swordone

総合スコア20651

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

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

friday_13

2018/06/18 08:34

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

0

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 03:25

tkturbo

総合スコア5572

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

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

friday_13

2018/06/18 05:35

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

2018/06/18 05:39

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

2018/06/18 05:46

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

0

ベストアンサー

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

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

Java

1public class StudentInfo { 2 private String name; 3 private String birth; // 文字列じゃない方が扱いやすいかも 4 private String address; 5 6 public StudentInfo(String name, String birth, String address) { 7 this.name = name; 8 this.birth = birth; 9 this.address = address; 10 } 11}

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

Java

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

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

投稿2018/06/18 02:54

編集2018/06/18 04:55
LouiS0616

総合スコア35660

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

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

friday_13

2018/06/18 04:02

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

2018/06/18 04:46

そのとおりです。
friday_13

2018/06/18 05:36

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問