对2个或更多大量结果集进行排序?

时间:2009-11-17 12:51:05

标签: java sorting

我需要能够对多个中间结果集进行排序,并按排序顺序将它们输入到文件中。排序基于单个列/键值。每个结果集记录都是值列表(如表中的记录)

  1. 通过查询完全不同的数据库获得中间结果集。
  2. 中间结果集已根据某个键(或列)进行排序。在将其写入文件之前,需要将它们组合并再次在同一个键(或列)上进行排序。
  3. 由于这些结果集可能很大(MB的顺序),因此无法在内存中完成。
  4. 我的解决方案:

    使用哈希和随机访问文件。由于结果集已经排序,因此在检索结果集时,我会将排序的列值存储为散列映射中的键。散列映射中的值将是随机访问文件中的地址,其中 每条记录与该列值相关联的内容将存储

    有什么想法吗?

3 个答案:

答案 0 :(得分:5)

指向每一组,最初指向第一个条目

然后从集合中选择下一个结果,该结果提供最低的条目

将此条目写入文件并递增相应的指针

这种方法基本上没有开销,时间是O(n)。 (这是Merge-Sort,顺便说一句)

修改

澄清:这是合并排序的 merge 部分。

答案 1 :(得分:2)

如果你有2个预先排序的结果集,你应该能够在编写输出文件的同时迭代它们。您只需要比较每组中的当前行: 简单示例(尚未准备好复制和粘贴使用!):

ResultSet a,b;
//fetch a and b
a.first();
b.first();
while (!a.isAfterLast() || !b.isAfterLast()) {
  Integer valueA = null;
  Integer valueB = null;

  if (a.isAfterLast()) {
    writeToFile(b);
    b.next();
  }
  else if (b.isAfterLast()) {
    writeToFile(a);
    a.next();
  } else {
    int valueA = a.getInt("SORT_PROPERTY");
    int valueB = b.getInt("SORT_PROPERTY");
    if (valueA < valueB) {
      writeToFile(a);
      a.next();
    } else {
      writeToFile(b);
      b.next();
    }
  }



}

答案 2 :(得分:1)

听起来您正在寻找Balance Line算法的实现。