【发布时间】:2015-05-11 16:33:25
【问题描述】:
我有一份显示 2-4 百万条记录的报告。我从 oracle 获取记录到 java 并将其推送到 excel 报告中。这一切都已经完成了!
现在,我还需要添加一个包含前 10 条和最后 10 条记录的新选项卡。最好的方法是什么?
我应该在 java 中使用 PriorityQueue 实现还是使用二叉树来跟踪前 10 名和最后 10 名。我不需要在数据结构中存储十亿条记录。我只需要一次保存10个。 例如:
PriorityQueue<DataObject> queueTop10 = new PriorityQueue<DataObject>(10, topComparator);
PriorityQueue<DataObject> queueLast10 = new PriorityQueue<DataObject>(10, leastComparator);
while (data is coming from database)
{
// push to excel stuff here
queueTop10 .add(dataObject); OR binarytreeTop.insert(dataObject)
queueLast10.add(dataObject); OR binarytreeLeast.insert(dataObject)
}
如果我也可以使用其他数据结构,请告诉我。
谢谢
【问题讨论】:
-
“前 10 名”是什么意思?每条记录都有某种分数吗?或者您是否正在寻找最常出现的键值?还是什么?
-
IMO 使用堆仅获取最小元素的工作量较少。树更有组织,但需要更多的计算来维持这种组织。在您的情况下,您需要访问前 10 和后 10 记录,而堆可能不适合您。我相信你应该使用树实现 (
TreeMap),额外的开销也许是合理的。 -
谁会阅读这些报告?如此多的记录开始进入“如果我们把这份报告的一页给这个国家的每个人......”或“如果我们把这些页面堆叠起来,我们将有一堆 X% 的方式到达月球”的领域。另外,OutOfMemoryError.
-
嘿!感谢您及时的回复。我真的很抱歉错字。我的意思是 2-4 百万条记录,而不是十亿条记录。我们将其保存为 CSV 格式,并将其划分为不同的输出文件。
-
是的,有分数。所以,topComparator 和 leastComparator 实现了逻辑。
标签: java binary-tree binary-search-tree priority-queue