如何填充Map <string,list <string =“”>&gt;从文本文件? -Difficulites动态命名每个List </string,>

时间:2014-09-27 07:09:16

标签: java list hashmap

这是文本文件。 K:表示键,V:表示我想要输入的列表中的值。即:草莓,杏和桃子在地图的关键A类中构成清单。

K: Class A//
V: Strawberry//
V: Apricot//
V: Peach//
K: Class B//
V: Chocolate//
K: Class C//
V: Creme de menthe//
V: Irish coffee//

此处的程序正确分配了键,但是将文件中的每个值添加到列表而不是我想要的值。

//FillHM.java 

import java.io.*;
import java.util.Scanner;
import java.util.*;          

public class FillHM  {

   public static void main (String[] args)  {
     Map<String, List<String>> map = new HashMap<String, List<String>>();
     Scanner sc1 = null;

     try  {  
        sc1 = new Scanner(new File("/home/craig/Desktop/mytext.txt"));
     }catch (FileNotFoundException e) {e.printStackTrace();}

     List<String>values = new ArrayList<>();
     String s = " ";
     String key = " ";

     while (sc1.hasNextLine())  {
            Scanner sc2 = new Scanner(sc1.nextLine());
            sc2.useDelimiter("//");

            while(sc2.hasNext())  {
                s = sc2.next();      
                if  (s.startsWith("K:"))  {
                    key = s;
                }       
                if (s.startsWith("V:"))  {
                    values.add(s);   
                }
                map.put(key, values);
            } //end while
     }  //end while 
     System.out.println(map);
  }
}

4 个答案:

答案 0 :(得分:3)

当您检测到新密钥时,请创建一个新列表:

if (s.startsWith("K:"))  {
    key = s;
    values = new ArrayList<>();
}

如果您不这样做,每个密钥都将映射到相同的列表。您希望每个键都映射到自己的列表。

答案 1 :(得分:1)

问题是,你不能使用values.clear(),因为它会清除所有键的值。 以下是解决方案。

  if (s.startsWith("K:")) {
          values = new ArrayList<>();
          key = s;       
  }

只需更改此if即可。

答案 2 :(得分:0)

问题是当密钥更改时,您的值列表永远不会清除。 因此,请确保在向地图添加键和值时清除列表

 if  (s.startsWith("K:"))  {
     key = s; 
     values.clear();
 }

答案 3 :(得分:0)

我想这段代码适合你的伙伴。 values.clear() 无法解决问题。

     Map<String, List<String>> map = new HashMap<String, List<String>>();
     Scanner sc1 = null;

     try  {  
        sc1 = new Scanner(new File("/home/craig/Desktop/mytext.txt"));
     }catch (FileNotFoundException e) {e.printStackTrace();}

     String s = "";
     String key = "";
     List<String>values=new ArrayList<>();

     while (sc1.hasNextLine())  {
            Scanner sc2 = new Scanner(sc1.nextLine());
            sc2.useDelimiter("//");

                s = sc2.next();      
                if  (s.startsWith("K:"))  {
                    if(values.size()!=0){
                        map.put(key, values);
                        //System.out.println(map);
                    }
                    key = s;
                    values=new ArrayList<>();
                }       
                else if (s.startsWith("V:"))  {
                    values.add(s);   
                }


     } 
     map.put(key, values);
     System.out.println(map);