2014-09-27 55 views
1

這是文本文件。 K:表示一個鍵,V:表示我想要輸入的列表中的值。即:草莓,杏和桃組成了地圖重點A級的清單。如何從文本文件填充地圖<String,列表<String>>? -Difficulites動態命名每個列表

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); 
    } 
} 
+1

只需在'while'循環的頂部調用'values.clear()'。 – sje397 2014-09-27 07:11:03

+1

他需要創建一個新列表,而不是清除現有列表。 – TechTrip 2014-09-27 07:19:08

回答

3

當你發現一個新的密鑰,創建一個新的列表:

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

如果你不這樣做,每個鍵將被映射到相同名單。您希望每個密鑰都映射到其自己的列表。

+0

0.o就這麼簡單。非常感謝波希米亞人; D – user3814983 2014-09-27 07:20:29

0

問題是,當密鑰更改時,您的值列表永遠不會清除。 所以一定要清除列表,當您添加鍵和值到地圖

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

的問題是,你不能使用values.clear(),因爲它會清除所有鍵的值。 所以下面是解決方案。

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

只要改變這個if

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); 
相關問題