タイトルのとおりなのですが、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
回答2件
あなたの回答
tips
プレビュー