2016-02-02 171 views
1

使用以下代碼,我能夠從表單中獲取所有必要的信息,該信息是;拆分正則表達式的結果

n = 5 
p = 0.5 
lambda = 0.3 
d = 1 
n = 8 
p = 0.1 
d = 1 
p = 0.3 

我把所有這些信息放在一個HashMap中,但我實際需要的是6個hashmaps;這樣

Hashmap 1 
n = 5 
p = 0.5 
Hashmap 2 
lambda = 0.3 
Hashmap 3 
d = 1 
Hashmap 4 
n = 8 
p = 0.1 
Hashmap 5 
d = 1 
Hashmap 6 
p = 0.3 

換句話說,總是當我正爲關鍵字,下一個關鍵字和值也應存放在此HashMap,這一個關鍵詞將永遠是一個頁。

我知道這是不是真的有可能分裂一個HashMap,但我無法找到任何其他方式

非常感謝

public static void main(String[] args) throws FileNotFoundException, IOException   
{ 
    File filename = new File("H:\\NetBeansProjects\\thesis2.0\\src\\thesis2\\pkg0\\txt-files\\formulier.txt"); 

    try (BufferedReader in = new BufferedReader(new FileReader(filename))) 
    { 

     HashMap hm = new HashMap(); 

     Pattern p = Pattern.compile("\\s+(\\w+)\\s+([0-9.]+)\\s*"); 
     for (String line; (line = in.readLine()) != null;) 
     { 
      Matcher m = p.matcher(line); 
      if (m.matches()) 
      { 
       String keyword = m.group(1); 
       String parameter = m.group(2); 

       hm.put(m.group(1),m.group(2)); 

       System.out.println(m.group(1) + " = " + m.group(2)); 
      } 
     } 
    } 
} 

回答

1

可以使用List<>存儲Map<> S,您基本上需要爲分配給下一個Map的值創建一個簡單的基於標記的解析器。

List<Map<String,String>> motherList = new ArrayList<>(); 
Map<String,String> workingChild = new HashMap<>(); 

.... 

String keyword = m.group(1); 
String parameter = m.group(2); 

workingChild.put(keyword,parameter); 
if(!keyword.equals("n")) { 
    motherList.add(workingChild); 
    workingChild = new HashMap<>(); 
} 

我們基本上是包含人我們的孩子地圖,每一個輸入關鍵字和參數1個motherlist,我們把它放在我們目前的工作地圖,然後我們把它放在motherMap只有在最後一個記號是不是「N」。

+0

感謝您的回答,我想知道這是否會工作,因爲在列表中他們總是添加一個地圖workingChild,這不會覆蓋以前製作的Hashmap,也稱爲workingChild? – StudentX

+0

@StudentX [Java始終按值傳遞](http://stackoverflow.com/a/40499/1542723),所以我們生成的HashMap將被放入列表中,然後我們可以重用參考'workingChild'而不會影響列表中的地圖。 – Ferrybig