【发布时间】:2015-04-11 17:39:27
【问题描述】:
我有一个 ArrayList,其中填充了来自文本文件的单词,我需要按单词的出现次数(从出现次数最多的单词到出现次数最少的单词)对其进行排序。我将带有单词的原始 ArrayList 复制到另一个 Arraylist 并在顶部添加出现次数。因此,新 ArrayList 中的单词将如下所示: "password:125" 其中 "password" 是单词,"125" 是 ArrayList 中出现的次数。
for (int i=0;i<sorter.size();i++) {
sorter2.add(sorter.get(i)+":"+Collections.frequency(sorter, sorter.get(i)));
}
然后我用这个类对 ArrayList 进行排序:
public class RepeatFormulaCounter implements Comparator<String> {
@Override
public int compare(String o1, String o2) {
if (findValue(o2) != findValue(o1)) {
return findValue(o2) - findValue(o1);
}
return o2.compareTo(o1);
}
public int findValue(String find){
int result=0;
String spliter[]=find.split(":");
result=Integer.parseInt(spliter[1]);
return result;
}
}
但是,由于我有 5 个填充单词的文本文件,其中 3 个文件大约 45000 个单词,2 个超过 1000000 个单词,大约 45000 个单词的文件被排序和显示没有任何问题,但是当我开始对超过 1 000 000 个单词的应用程序进行排序。为什么会这样?我该如何解决?
请注意我正在使用 GUI 应用程序来显示它。而且我正在使用 2 个类似的排序类,用于按不同标准进行排序的其他方式,这些方式显示和执行没有任何问题。
【问题讨论】:
-
你在 GUI 中显示什么?您正在使用哪些 GUI 组件?更有可能是 GUI 组件无法处理太多数据点的问题。
-
因为排序不是一项简单的任务。你用什么算法来排序?无论如何,你应该让你的
compare函数更快,不要为两个对象调用 findValue() 两次。如果您执行超过 1000 万次,整数解析是相当昂贵的。 -
我通过附加 10 个单词来显示“JTextArea”上出现频率最高的 10 个单词。
-
好的。程序可能会卡住,因为它会产生大量垃圾并有很多 GC 周期。您可以使用 jconsole 或 jvisualvm 进行检查。至少您将能够确定程序是否由于 cpu 负载或内存问题而卡住。
-
谢谢你们的回答,我需要一段时间才能理解并尝试一切。 :)