java从一百万条记录中获得前十名和后十名
我有一份报告显示了200-400万条记录。我将记录从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)
}
请让我知道,如果我可以使用一些其他数据结构以及
谢谢
# 1 楼答案
excel电子表格中有40亿条记录?不,你没有https://superuser.com/questions/366468/what-is-the-maximum-allowed-rows-in-a-microsoft-excel-xls-or-xlsx
您应该在数据库上执行此操作,而不是依赖java实现。对于如此多的记录,它的效率必然低于优化的db查询
# 2 楼答案
顶级命中算法使用最小堆(Java中为^{} ),但在算法中应该有一些大小检查。假设每个项目都有一个分数,您希望收集分数最高的10个项目
PriorityQueue
有效地公开得分最低的项目:# 3 楼答案
您可以使用优先级队列,因为它的行为类似于Java中的堆。见How does Java's PriorityQueue differ from a min-heap? If no difference, then why was it named PriorityQueue and not Heap?
# 4 楼答案
PriorityQueue<T>
无法按原样处理代码,因为构造函数中的10是初始容量;随着您的移动,您的队列将增加到1B个项目然而,
TreeSet<T>
将起作用,只需稍加修改。您需要添加代码,以便在队列每次增长超过10个时删除第11个项目: