从文本文件创建嵌套的hashmap:并非所有存储的数据都可能被覆盖

时间:2014-05-29 16:22:32

标签: java hashmap overwrite

我需要读取两个文件,将它们添加到hashmap并进行比较。它是一个手动执行的大文件。这是我的Java代码:

 /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws FileNotFoundException, IOException {
        // TODO code application logic here
        BufferedReader in1 = new BufferedReader(new FileReader("comparetheresults/595231gov_nov_13_assessed.txt"));
        BufferedReader in2 = new BufferedReader(new FileReader("comparetheresults/627231farsidetect.txt"));

          HashMap<String, HashMap<String, ArrayList<String>>> hmap1 = new HashMap<String, HashMap<String, ArrayList<String>>>();
          HashMap<String, HashMap<String, ArrayList<String>>> hmap2 = new HashMap<String, HashMap<String, ArrayList<String>>>();
          ArrayList<String>  rel= new ArrayList<String>();
          String Id = null;


         String line = null;
         String relation = null;
         while ((line = in1.readLine()) != null){
             if(line.contains("ID:")){
                 hmap1.put(line, new HashMap<String, ArrayList<String>>());
                 Id = line;
             }
             else if(line.contains("Relation:")){
                 relation = line;
             }
             else if(line.contains("Result:")){
                 if(rel == null)
                    rel= new ArrayList<>();
                 rel.add(line);
                 hmap1.get(Id).put(relation, rel);
             }
             else if(line.contains("TP") || line.contains("FP") || line.contains("TN") || line.contains("FN")){
                 rel.add(line);
                 hmap1.get(Id).put(relation, rel); 
                 rel = null;
             }

         }

        for (Object e : hmap1.entrySet()) {
            System.out.print(e);
        }
        System.out.println();



        in1.close();
        in2.close();
    }

}

这里是“读取的文件”的格式

  

ID:01
句子:等等等等等等。关系:等等等等   结果:abc
TN

     

ID:01
句子:等等等等等等。关系:等等等等   结果:xyz
FP <
p

     

ID:02
句子:等等等等等等。关系:等等等等   结果:blah blah
FP

问题是,我只能在结果中看到每个ID的一个条目。其他数据可能会被覆盖。我用hashmap格式有什么问题吗?

请帮助。

感谢。

1 个答案:

答案 0 :(得分:0)

您的问题是您有一个文件,其中多次存在相同的ID,并且您没有正确处理这种情况。

您检查Result:条目是否在地图中,并将结果添加到存储在Relation:中指定的密钥的ArrayList中,但是您不会检查是否在创建新的HashMap之前,ID已存在于地图中。

此行是为每个ID覆盖您的数据

if(line.contains("ID:")){
     hmap1.put(line, new HashMap<String, ArrayList<String>>());
     Id = line;
}

如果该行包含ID:,您可以使用ID:中定义的任何键创建新的HashMap,即使已存在该键。

如果您要添加到已存储在此密钥中的数据,您需要执行与Result:

逻辑相同的操作
if(line.contains("ID:")){
    if ( hmap1.containsKey(line) ) {
        // get the entry and do something with it
    }
    else { 
        hmap1.put(line, new HashMap<String, ArrayList<String>>());
    }
    Id = line;
}

此外,您似乎对Result:字段的处理存在一个小问题,因为您正在使用ArrayList执行奇怪的操作来存储结果。它的编码方式,看起来并不像你想要的那样。假设你有一个结果,并将它添加到一个新的列表中,然后你想在结果列表中添加其他内容,你永远不会从HashMap中获取列表来添加它,你只需要创建一个新的ArrayList时间。

请改为尝试:

else if(line.contains("Result:")){
    // check if the key exists in the map, or if the value is null
    if( !hmap1.get(Id).containsKey(relation) || hmap1.get(Id).get(relation) == null ) {
        rel = new ArrayList<>(); // make new list
    }
    // otherwise, get the list from your map
    else {
        rel = hmap1.get(Id).get(relation); // get the result list
    }
    // add result to the list
    rel.add(line); 
    // add the list to the map...
    hmap1.get(Id).put(relation, rel);
}

希望这有帮助。