我需要读取两个文件,将它们添加到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 <
pID:02
句子:等等等等等等。关系:等等等等 结果:blah blah
FP
问题是,我只能在结果中看到每个ID的一个条目。其他数据可能会被覆盖。我用hashmap格式有什么问题吗?
请帮助。
感谢。
答案 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);
}
希望这有帮助。