public static void main(String args[]) throws FileNotFoundException, IOException
{
FileReader in = new FileReader("/home/aoblah/Downloads/file1.txt");
BufferedReader br = new BufferedReader(in);
// Scanner in = null;
String answer = null;
String verb = null;
String line = null;
String [] split_npn = null;
String [] split_pn = null;
String [] split_dp2 = null;
String [] split_dp3 = null;
HashMap<String, HashMap<String, ArrayList<String>>> hmap = new HashMap<String, HashMap<String, ArrayList<String>>>();
try {
while ((line = br.readLine()) != null)
{
if(line.contains("verb"))
{
verb = line.substring(0, line.indexOf("("));
if(line.contains("npn")){
String test = line.substring(line.indexOf("npn"));
answer = test.substring(test.indexOf("npn"),test.indexof(']'));
answer = answer.replace(",", " " );
split_npn = answer.split(" ");
}
if(line.contains("pn")){
String test = line.substring(line.indexOf("pn"));
answer = test.substring(test.indexOf("pn"), test.indexOf(']'));
answer = answer.replace(",", " " );
split_pn = answer.split(" ");
}
if(line.contains("dp2")){
String test = line.substring(line.indexOf("dp2"));
answer = test.substring(test.indexOf("dp2"), test.indexOf(']'));
answer = answer.replace(",", " " );
split_dp2 = answer.split(" ");
}
if(line.contains("dp3")){
String test = line.substring(line.indexOf("dp3"));
answer = test.substring(test.indexOf("dp3"), test.indexOf(']'));
answer = answer.replace(",", " " );
split_dp3 = answer.split(" ");
}
}
if(split_npn != null){
ArrayList<String> npn = new ArrayList<String>();
hmap.put(verb, new HashMap<String, ArrayList<String>>());
for(int i = 1; i< split_npn.length; i++){
npn.add(split_npn[i]);
}
npn.trimToSize();
hmap.get(verb).put("npn", npn);
}
if(split_pn != null){
ArrayList<String> pn = new ArrayList<String>();
hmap.put(verb, new HashMap<String, ArrayList<String>>());
for(int i = 1; i< split_pn.length; i++){
pn.add(split_pn[i]);
}
pn.trimToSize();
hmap.get(verb).put("pn", pn);
}
if(split_dp2 != null){
ArrayList<String> dp2 = new ArrayList<String>();
hmap.put(verb, new HashMap<String, ArrayList<String>>());
for(int i = 1; i< split_dp2.length; i++){
dp2.add(split_dp2[i]);
}
dp2.trimToSize();
hmap.get(verb).put("dp2", dp2);
}
if(split_dp3 != null){
ArrayList<String> dp3 = new ArrayList<String>();
hmap.put(verb, new HashMap<String, ArrayList<String>>());
for(int i = 1; i< split_dp3.length; i++){
dp3.add(split_dp3[i]);
}
dp3.trimToSize();
hmap.get(verb).put("dp3", dp3);
}
System.out.println(hmap);
}
}
catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
该文件包含
等条目平静(动词,NAUX,[nullobj,[DP2,向下],[DP3,向下],镇静)。
镇静(动词,[SG],平静)。
平静(动词,[SG,PL,CN],平静)。
平静(动词,[PL,INF〕,平静)。
镇静(动词,[和],平静)。
从容(ADV,MV,从容)。
平静(名词,[SG],平静)。
我将所有动词,与之关联的介词的类别以及介词存储在嵌套的哈希映射中。 我只打印一个与动词相关的特定类型的介词时没有问题,但是当我显示整个hashmap时,程序只运行并且永不停止...最终在java中出现空间堆错误。我该如何解决这个记忆问题?
答案 0 :(得分:0)
一个建议是,而不是做System.out.println(hmap);
尝试将其打印出来:
for(String outerKey: hmap.keySet())
{
System.out.println(outerKey + ": ");
Map inner = hmap.get(outerKey);
for(String innerKey : innerMap)
{
System.out.print(innerKey + ": ");
System.out.println(innterMap.get(innerKey).toString());
}
}
答案 1 :(得分:0)
使用
打印地图System.out.println(hmap)
这使用toString()
的{{1}}方法,该方法在内存中为整个输出构建一个大字符串。根据输入文件读取的大小,这可能是很多内存。
打印迭代条目的地图会更好:
HashMap
这将为一个条目分配内存,打印它,将它交给垃圾收集器并取下一个条目。