【发布时间】:2010-10-18 01:47:28
【问题描述】:
在更新进度条时对集合进行排序的最佳方法是什么?目前我有这样的代码:
for (int i = 0; i < items.size(); i++)
{
progressBar.setValue(i);
// Uses Collections.binarySearch:
CollectionUtils.insertInOrder(sortedItems, item.get(i));
}
这显示了进度,但随着sortedItems 中项目数量的增加,进度条会变慢。有没有人有更好的方法?理想情况下,我想使用类似于Collections.sort() 的界面,以便尝试不同的排序算法。
任何帮助都会很棒!
作为背景知识,这段代码从 Lucene 拉回大量文档(1-1000 万)并在它们上运行自定义比较器。通过将数据写回磁盘来对它们进行排序将太慢而不实用。大部分成本是从磁盘读取项目,然后在项目上运行比较器。我的 PC 有大量内存,因此不存在与交换到磁盘等相关的问题。
最后我选择了 Stephen 的解决方案,因为它非常干净,让我可以轻松添加多线程排序算法。
【问题讨论】:
-
您的进度条是否有一些可定义的最大值?因为 9000 长度数组的 30% 与 90 长度数组的 30% 有很大不同。
-
@Anthony 进度条的最大值是
items.size()。我通常会排序数百万或数千万。 -
我不会选择对内存中的数千万个项目进行排序。我更有可能将它们写入磁盘文件并调用操作系统排序。
-
正如我在回答中所说,问题在于插入新项目的时间取决于集合的大小,因此随着集合变大,它的定义会变慢。请参阅我的答案以获得更详尽的解释。
-
它可能会因为
item.get(i)而变慢 - 并非所有集合都适合索引访问。如果您可以包含更多源代码,特别是显示项目集合的声明方式,那就太好了。
标签: java sorting progress-bar