有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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)
    }

请让我知道,如果我可以使用一些其他数据结构以及

谢谢


共 (4) 个答案

  1. # 2 楼答案

    顶级命中算法使用最小堆(Java中为^{}),但在算法中应该有一些大小检查。假设每个项目都有一个分数,您希望收集分数最高的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);
      }
    }
    
  2. # 4 楼答案

    PriorityQueue<T>无法按原样处理代码,因为构造函数中的10是初始容量;随着您的移动,您的队列将增加到1B个项目

    然而,TreeSet<T>将起作用,只需稍加修改。您需要添加代码,以便在队列每次增长超过10个时删除第11个项目:

    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();
        }
    }