我可能只是在做一些愚蠢的事情,但我试图编写一个程序,它将从xml文件中获取所有文本,将其作为字符串放入arraylist中,然后找到某些重复的字符串并计算它们。它基本上可以工作,但由于某种原因,它不会通过整个xml文件。它是一个超过15000行的相当大的文件(理想情况下,我希望能够提供任意数量的行)。我做了一个测试,将它放在arraylist中的所有内容输出到.txt文件中,最后一行只是说" no",还有更多的文本/行要经过。
这是我用来制作arraylist的代码(行数是文件中的行数):
// make array of strings
for (int i=0; i<lines; i++) {
strList.add(fin2.next());
}
fin2.close();
然后我用以下方法搜索所需的字符串:
// find strings
for (String string : strList) {
if(string.matches(identifier)){
count++;
}
}
System.out.println(count);
fout.println(count);
它基本上有效(编剧和扫描仪工作,行计数工作等),除了arraylist不会从.xml文件中获取所有文本,所以当然最后的计数是不准确的。 arraylist不是这个问题的最佳解决方案吗?
答案 0 :(得分:1)
这是 BAD 做法。每次将字符串放入ArrayList并将其保留在那里时,您的内存使用量就会增加。文件越大,使用的内存就越多,直到你想知道为什么你的应用程序使用了75%的内存。
您不需要将行存储到ArrayList中以查看它们是否匹配。您只需阅读该行并将其与您要比较的任何文本进行比较。
以下是您修改的代码:
String nextString = "";
while (fin2.hasNext()) {
nextString = fin2.next();
if (nextString.matches(identifier) || nextString.matches(identifier2)) {
count++;
}
}
fin2.close();
System.out.pritnln(count);
消除两次循环,节省大量内存,并为您提供准确的结果。另外,我不确定你是否有意阅读整行,或者你有某种令牌。如果您想阅读整行,请将hasNext
更改为hasNextLine
,将next
更改为nextLine
编辑:修改代码以显示查找多个字符串的样子。
答案 1 :(得分:0)
您是否尝试使用地图,例如HashMap。由于您的目标是从xml中找到单词的出现,因此hashmap会让您更轻松。
答案 2 :(得分:0)
问题不在于您的ArrayList,而在于您的for循环。发生的事情是你使用文件中的行数作为你的标记值,而不是每行增加1,你就是每个单词都这样做。因此,并非所有单词都添加到ArrayList中,因为循环比预期更早终止。希望这有帮助!
编辑:我不知道你现在使用什么对象来收集这个xml文件的内容,但我建议改用Scanner(将File作为参数传递给构造函数)并替换当前的for循环使用while (nameOfScanner.hasNextLine())
的while循环