Java - 尝试创建字符串的arraylist但arraylist已满(?)

时间:2015-06-11 01:27:26

标签: java arraylist

我可能只是在做一些愚蠢的事情,但我试图编写一个程序,它将从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不是这个问题的最佳解决方案吗?

3 个答案:

答案 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循环