2016-12-16 55 views
0

我有一个包含多个分类行的文件。 现在我想将所有这些行排序到一个新文件中的一个合并行中。不需要一次加载所有数字。从.txt文件中获取合并行

这是我的文件的一部分:

12,86,280,304,350,359,371,391,405,548, 
 
255,264,325,346,435,466,483, 
 
39,114,214,298,317,377,428,438,575, 
 
35,165,183,281,336,367,386,418,438,593, 
 
44,77,97,117,122,156,251,415,533, 
 
109,155,163,172,212,226,340,358,452,577,592, 
 
33,74,91,204,256,307,357,388,534,552,554,570, 
 
50,99,246,309,345,358,395,405,419,425,566,

现在我想这些排序合并,所以起初我需要知道文件多少行了。然后我需要获取所有的第一个元素并进行比较。我写入新文件的最低。然后,我必须从我刚刚写下的行中得到第二个数字。并将它们与其他行的第一个数字进行比较。我该怎么做呢。我写了一个归并为的ArrayList:

 //as long as there is unsorted data 
 
     while (listOfOutputs.size() > 0) { 
 
      //Set the lowest undefined 
 
      List<Integer> lowest = null; 
 
      for (List<Integer> list : listOfOutputs) { 
 
       //if the lowest is undefined, I'm the lowest 
 
       if (lowest == null) { 
 
        lowest = list; 
 
        //Else am I lower then the lowest? Then I'm the lowest 
 
       } else if (list.get(0) < lowest.get(0)) { 
 
        lowest = list; 
 
       } 
 
      } 
 

 
      //Finally the lowest is added to the sorted list and removed to from his own list. 
 
      assert lowest != null; 
 
      sortedList.add(lowest.remove(0)); 
 

 
      //Is the size of the list which contained to lowest now 0, remove him from the listOfOutputs 
 
      if (lowest.size() == 0) listOfOutputs.remove(lowest); 
 
     }

但我不知道怎么改写成一个排序我的文件这一点。我如何做到这一点,而无需将它们加载到列表中。

斯文

+1

简单地阅读每一行,在读取时解析每一行并将每个已解析的整数附加到一个列表中,最后一次对整个列表进行排序是否可行? – jarmod

+0

您的数据是否太大而无法放入内存?这就是为什么你不想只将所有数据加载到一个数组中并对其进行排序的原因? –

回答

0

可以使用一个简单的2路合并为2行同时合并成一个单一的线,直到单个排序线产生重复该过程。

假设k为行数,可以实现第k路合并,可能使用一个堆来优化找到哪一行具有最小的第一个元素。每个堆元素都包含对行的引用,并等同于该行的当前元素的索引(或指针)。堆由每行的当前元素排序,以便堆的头部以当前最小元素引用行。堆由所有k行的第一个元素初始化。

对于每个合并步骤,将从堆头(具有最小元素的行)中删除该行,将该最小元素附加到输出行,并将具有最小元素的行添加回到基于下一个元素的堆。

当到达行的末尾时,合并会缩减为k-1路合并,最终只会复制到合并输出的单行。

+0

这是可能的,但不是我想要的。你能告诉我如何得到连续的元素数吗? –

+0

@SvenOrdelman - 您可以扫描行寻找一个行终止符,通常是一个新的行字符'\ n'。如果在合并过程中前进到行中的下一个元素时可以确定行的末尾,这可能不是必需的,因为合并过程只需要知道行中是否存在元素或者是否存在线路已经到达。 – rcgldr