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

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

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

Collections APIは開発者に複数のクラスやインターフェイスを供給し、多くのオブジェクトを扱いやすくします。

Java

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

ArrayList

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

Q&A

解決済

2回答

6152閲覧

Java のList<List<String>>で繰り返し処理をするごとに新しい要素を作る

nanimowakaranai

総合スコア20

Collections API

Collections APIは開発者に複数のクラスやインターフェイスを供給し、多くのオブジェクトを扱いやすくします。

Java

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

ArrayList

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

0グッド

0クリップ

投稿2019/08/07 07:39

編集2019/08/07 08:37

タイトルのとおりなのですが、Hashmap<String,List<List<String>>>のデータを作ってその中に繰り返し処理を使ってList<List<String>>にkeyごとにあたらしいデータを入れていきたいのですがどのようにすればいいのかわかりません。例えば
keyが果物のとき、valueにりんご、バナナというリストが入っていて次の繰り返し時に新しくListをnew宣言して中身を空にして追加していって
keyが動物のときvalueに像、キリンと追加していくと
すべて出力するときに
果物 像、キリン
動物 像、キリンとなってしまいます。原因自体は理解していて新しくnew 宣言したvalue変数に新しいリストを追加していってもその前のmapのkeyのvalueと同じ変数であるから結局最後に追加していったvalueのリストと同じ中身になってしまってしまうんだと思います。
この場合全く新しいリストを繰り返し処理で作成して最終的に
key→果物 value→(りんご、ばなな)
key→動物 value(このvalueと↑のvalueは違う変数)→(像、キリン)とするにはどうすればいいのでしょうか

追記
問題のコードを追加しました。書き方が気持ち悪いというのは自覚しているのですが今回は見逃してください・・・

java

1import java.io.*; 2import java.lang.reflect.Array; 3import java.nio.file.Files; 4import java.nio.file.Path; 5import java.nio.file.Paths; 6import java.util.*; 7 8 9 10public class Test { 11 12 13 public static void main(String args[]) { 14 List<String> value = new ArrayList<>(); 15 List<List<String>> values = new ArrayList<>(); 16 List<String> lines = new ArrayList<>(); 17 18 HashMap<String, List<String>> tsv = new HashMap<>(); 19 try { 20 Path path = Paths.get("test.tsv"); 21 lines = Files.readAllLines(path); 22 23 } catch (IOException ie) { 24 System.out.println("入出力エラーです"); 25 } 26 Test.sort_tsv(tsv,value,values,lines); 27 Test.solve(tsv,value); 28 29 30 } 31 public static void sort_tsv(HashMap<String, List<String>> tsv, List<String> child_value, List<List<String>> parent_value, List<String> line){ 32 for(int i = 0; i < line.size();i++){ 33 String[] split_line = line.get(i).split("\t", 0); 34 if (tsv.containsKey(split_line[0])) { 35 tsv.get(split_line[0]).add(split_line[1] + ":"); 36 tsv.put(split_line[0], tsv.get(split_line[0])); 37 } else { 38 parent_value.add(child_value); 39 child_value.add(i, split_line[1] + ":"); 40 tsv.put(split_line[0], parent_value.get(parent_value.size() - 1)); 41 } 42 } 43 } 44 public static void solve(HashMap<String,List<String>> tsv, List<String> child_value){ 45 for (String key : tsv.keySet()) { 46 String val = String.join("", child_value); 47 StringBuilder value_cut = new StringBuilder(val); 48 value_cut.setLength(value_cut.length() - 1); 49 System.out.println(key + "\t" + value_cut); 50 } 51 } 52} 53 54

tsv

1fruit apple 2fruit banana 3pet dog 4pet cat
実行結果 fruit apple:banana:dog:cat pet apple:banana:dog:cat
想定実行結果 fruit apple:banana pet dog:cat

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

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

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

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

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

azuapricot

2019/08/07 07:51

文章だけじゃ何が言いたいか全くわからないので、実コードを提示して下さい。
BluOxy

2019/08/07 07:52

map.put("果物",りんごやバナナのリスト); map.put("動物",像やキリンのリスト); では駄目なんでしょうか。 また、該当のコードを見せて頂けると状況が分かりやすいと思います。
m.ts10806

2019/08/07 08:26

>書き方が気持ち悪いというのは... それは見た人が感じることであって自己弁護のように入れておく必要はないと思います。 質問内容に必要なのはあくまで要件と問題と再現できるコードなので。
guest

回答2

0

ベストアンサー

一見不必要に見える処理を排除してコードを書きました。
質問内容を解決するための処理は実装されています。
(デバッグはしていないため、参考程度に留めてください)

また、命名も直しました。
(単数形なのか複数形なのかが分からず、メソッド名から中の処理が想像できなかったため)

java

1import java.io.*; 2import java.lang.reflect.Array; 3import java.nio.file.Files; 4import java.nio.file.Path; 5import java.nio.file.Paths; 6import java.util.*; 7 8public class Test { 9 public static void main(String args[]) { 10 List<String> lines = new ArrayList<>(); 11 try { 12 Path path = Paths.get("test.tsv"); 13 lines = Files.readAllLines(path); 14 } catch (IOException ie) { 15 System.out.println("入出力エラーです"); 16 } 17 18 HashMap<String, List<String>> tsvMap = createTsvAsMap(lines); 19 display(tsvMap); 20 } 21 22 public static HashMap<String, List<String>> createTsvAsMap(List<String> lines){ 23 HashMap<String, List<String>> tsvMap = new HashMap<>(); 24 for(String line : lines){ 25 String[] elements = line.split("\t", 0); 26 if (!tsvMap.containsKey(elements[0])) { 27 List<String> values = new ArrayList<>(); 28 tsvMap.put(elements[0], values); 29 } 30 tsvMap.get(elements[0]).add(elements[1]); 31 } 32 return tsvMap; 33 } 34 35 public static void display(HashMap<String,List<String>> tsvMap){ 36 for (Entry<String, List<String>> entry : tsvMap.entrySet()) { 37 System.out.println(entry.getKey() + "\t" + String.join(":",key.getValue())); 38 } 39 } 40}

やっていることは至極単純で、下記のようにHashMapを作成しています。
0. 読み込んだtsvの1列目をキー、2列を値として読込む
0. そのキーがまだHashMapに存在しない場合はリストのインスタンスを作成し、putする
0. キーが存在する場合はHashMapからそのキーを元にgetして、リストに値をaddする

余談ですが、表示するときはString.joinを使って:を連結文字として扱うと短くコードが書けます。

投稿2019/08/07 08:27

編集2019/08/07 08:38
BluOxy

総合スコア2663

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

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

nanimowakaranai

2019/08/07 08:36

わざわざコードを書いていただいてありがとうございます。 Exception in thread "main" java.lang.NullPointerException at Test.createTsvAsMap(Test.java:30) at Test.main(Test.java:18) が発生しているのですがこれはどのように対処すればよいのでしょうか。お手数おかけして申し訳ございません。
BluOxy

2019/08/07 08:37

if (tsvMap.containsKey(elements[0])) ではなく if (!tsvMap.containsKey(elements[0])) でした。
BluOxy

2019/08/07 08:39

とりあえずコピペで動かすのではなく、プログラムの流れを読んでいただけると幸いです。 ここはコーディング代行サイトではないので。
nanimowakaranai

2019/08/07 08:41

結果が出力されました!ありがとうございます!
BluOxy

2019/08/07 08:43

なぜ正しく動いた・動いているのかはご理解いただけましたか。 実装の不明点があれば答えますので、聞いてください。
nanimowakaranai

2019/08/07 08:48

ありがとうございます! HashMap<String, List<String>> tsvMap = createTsvAsMap(lines);と public static HashMap<String, List<String>> createTsvAsMap(List<String> lines) が今まで見たことがない書き方だったのでいまいちよくわからないです。これはどういった文法なのでしょうか?
BluOxy

2019/08/07 08:56

「Java メソッド 戻り値」で調べてみてください。 >public static HashMap<String, List<String>> createTsvAsMap(List<String> lines) 元々のコードではsort_tsv、solveというメソッドがありますが、戻り値はなし(void)になっています。 それをやめて、戻り値を「HashMap<String, List<String>>」のオブジェクトで返すように変更しました。 上記のような実装をしたとき、createTsvAsMapメソッドを呼び出す際は >HashMap<String, List<String>> tsvMap = createTsvAsMap(lines); と書くことができます。 このように呼び出すと、createTsvAsMapメソッドの戻り値をtsvMapに渡すことができます。
BluOxy

2019/08/07 09:14 編集

実装の不明点を答えるとは言いましたが、語弊がありました。 Javaの構文・作法についてはこの質問の範疇外になるので、調べるかまた別の質問を立ててください。 私の書いたコードがどのようにして下記要件を満たしたのか分からない場合はお答えします。 >Hashmap<String,List<List<String>>>のデータを作ってその中に繰り返し処理を使ってList<List<String>>にkeyごとにあたらしいデータを入れていきたい
guest

0

key→果物 value→(りんご、ばなな)

であれば、

Map<String, List<String>>

で十分ではないかと思います。

投稿2019/08/07 08:34

A-pZ

総合スコア12011

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問