2016-02-02 173 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