从一百万记录中获得前10名,最后10个



我有一个报告显示了2-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)
    }

请让我知道我是否也可以使用其他一些数据结构。

谢谢

顶部命中算法使用min-heap(java中的PriorityQueue),但是您的算法中应该检查一些大小。假设每个项目都有一个分数,您想收集10个分数的10个项目。PriorityQueue有效地以最低得分露出项目:

PriorityQueue<DataObject> top = new PriorityQueue(10, comparator);
for (DataObject item : items) {
  if (top.size() < 10) top.add(item);
  else if(comparator.compare(top.peek(), item) < 0) {
    top.remove();
    top.add(item);
  }
}

您可以使用优先级队列,因为它像Java中的堆一样。看看Java的优先级与Min-Heap有何不同?如果没有区别,那么为什么它命名为PriorityQueue而不是堆?

PriorityQueue<T>将无法与您的代码合作,因为构造函数中的10是初始容量;您的队列随着您而出现的1B项目。

但是,TreeSet<T>会进行较小的修改。您需要添加每次排队生长十个以上时删除第十一个项目的代码:

TreeSet<DataObject> top10 = new TreeSet<DataObject>(topComparator);
TreeSet<DataObject> bottom10 = new TreeSet<DataObject>(leastComparator);
while (data is coming from database) {
    top10.add(dataObject);
    if (top10.size() == 11) {
        top10.pollLast();
    }
    bottom10.add(dataObject);
    if (bottom10.size() == 11) {
        bottom10.pollLast();
    }
}

在Excel电子表格中的40亿张记录?不,您不https://superuser.com/questions/366468/what-is-the-maximin-rown-rows-rows-in-a-a-a-microsoft-excel-excel-xls-xls-or-xlsx

您应该在数据库上执行此操作,而不是依赖Java实现。为此,许多记录肯定不如优化的DB查询效率。

最新更新