2013-03-13 49 views
3

我真的很感激,如果有人可以帮助我这个。我试图做外部排序,我被困在合并的一部分。我得到我应该如何合并它只是不知道使用什么功能。用Java读取文件的好方法

现在我正在尝试读取多个小文本文件的第一个单词,并将它们存储在文件数量大小的字符串数组中。所以基本上我会有每个文件的第一个字的字符串数组。然后我确定哪一个字母是最小的字母,然后将它写入一个新文件,之后我将读取该最小单词文件的下一个单词。这个单词将放置在字符串数组中输出的最小单词的位置,并将其与其他文件中第一个单词的其余部分进行比较。这将继续重复,直到所有单词排序。

我遇到的主要问题是,我正在使用扫描仪,并且在比较它的第一次运行后不能将最小的单词与文件中的下一个单词切换,因为扫描仪没有保留它的一个点已阅读。我知道readline做,但由于我的文件都是单词分隔只有一个空格,我不能使用readline。有人能指导我有足够的阅读功能,不能帮助我解决这个问题。

for (int i = 0; i<B;i++) 
    { 
    try 
    { 
    BufferedReader ins = new BufferedReader(new FileReader(Run-"+ i + ".txt")); 
    Scanner scanner2 = new Scanner(ins); 
    temp3[i] = scanner2.next(); 

       System.out.println(temp3[i]); 
      } 
      catch(IOException e) 
      { 
      } 
     } 
     for(int i=0;i<N;i++) 
     { 
      String smallest = temp3[0]; 
      int smallestfile = 0; 
      for(j=0;j<B;j++) 
      { 
       int comparisonResult = smallest.compareTo(temp3[j]); 
       if(comparisonResult>0) 
       { 
       smallest = temp3[j]; 
       smallestfile = j; 
       } 
      } 
      BufferedReader ins = new BufferedReader(new FileReader("C:/Run-"+ smallestfile + ".txt")); 
      Scanner scanner2 = new Scanner(ins); 
      if(scanner2.hasNext()) 
      { 
       temp3[smallestfile]=scanner2.next(); 
      } 
     } 
} 
catch(Exception e) 
{ 
} 
+2

哦,请格式​​化这一段,把它分成多段。我很难读这个,对不起。 – Mordechai 2013-03-13 03:57:08

+0

对不起,我有点重新格式化了这个段落。这只是我真的需要这样做,我真的被困在这一部分。 – user2163684 2013-03-13 04:02:23

+0

所有文件只是一行吗? – jabbie 2013-03-13 04:13:24

回答

0

至于临时排序/存储的话,使用PriorityQueue(不是数组)。对不起,我正忙着看棒球增加更多。

+0

感谢您的评论。我只是通过使用字符串数组来获得排序部分的工作。我真的只需要完成这部分。非常感谢。 – user2163684 2013-03-13 04:27:57

1

如果文件足够小,请将整个文件读到内存中,然后使用String.split()分隔数组中的字符串并发挥您的魔力。

如果文件比较大,请保持然后打开并读取每个字节,直到找到和空格,然后对所有文件执行此操作,比较字符串,执行您的魔术并重复,直到所有文件结束。

编辑:

  • 如何与BufferedReader
  • 读取文件如何分割与String.split()

字符串行= readeOneLineFromTheCurrentFile()的线; String [] words = line.split(“”);

+0

如果您有时间,请为我写一个简单的例子。我的大脑现在正在被炒。 – user2163684 2013-03-13 04:24:51

+1

如果你没有时间,你不必如此。我完全明白。我不想看起来像我要求太多。 – user2163684 2013-03-13 04:33:35

+0

几乎睡在键盘:)只是在评论中添加一些小件,希望它指导的方式! – 2013-03-13 04:34:33

0

我不确定,如果我理解你的权利,但Scanner确实保留在一个文件中的位置。你只需要为其中不乏像有文件

import java.util.Scanner; 
import java.io.File; 
import java.io.FileNotFoundException; 

public class so { 
    // returns the index of the smallest word 
    // returns -1 if there are no more words 
    private static int smallest(String[] words) { 
     int min = -1; 
     for (int i = 0; i < words.length; ++i) 
      if (words[i] != null) { 
       if (min == -1 || words[i].compareTo(words[min]) < 0) 
        min = i; 
      } 

     return min; 
    } 

    public static void main(String[] args) throws FileNotFoundException { 
     // open all files 
     Scanner[] files = new Scanner[args.length]; 
     for (int i = 0; i < args.length; ++i) { 
      File f = new File(args[i]); 
      files[i] = new Scanner(f); 
     } 

     // initialize first words 
     String[] first = new String[args.length]; 
     for (int i = 0; i < args.length; ++i) 
      first[i] = files[i].next(); 

     // compare words and read following words from scanners 
     int min = smallest(first); 
     while (min >= 0) { 
      System.out.println(first[min]); 
      if (files[min].hasNext()) { 
       first[min] = files[min].next(); 
      } else { 
       first[min] = null; 
       files[min].close(); 
       files[min] = null; 
      } 

      min = smallest(first); 
     } 
    } 
} 

A.TXT测试:a d g j
b.txt:b e h k m
c.txt:c f i

更新

在你的例子中,你打开并关闭外部文件for循环。当你下一次重新打开文件时,它当然会从文件的开头开始。

为防止发生这种情况,您必须保持文件处于打开状态并将scanner2变量及其初始化移动到outer for循环之前。您还需要多个Scanner变量(即数组)来同时打开多个文件。

+0

我明白你在这里的意思,但是在它没有奏效之前我尝试过。假设我有3个文件,每个文件包含3个单词。我从每个文件中取出第一个单词并进行比较。当我发现最小的那个与3相比时,我打印出那个单词,然后从那个文件中打印出来,我想在接下来的单词中看到。当我使用扫描仪时,它只是不断给我回文件中的第一个单词。 – user2163684 2013-03-13 11:58:38

+0

@ user2163684这不应该发生,因为['Scanner.next'](http://docs.oracle.com/javase/6/docs/api/java/util/Scanner.html#next%28%29)说“**抛出**:NoSuchElementException - 如果没有更多的标记可用”。 – 2013-03-13 12:04:00

+0

@ user2163684我不想拿出所有的乐趣,但请看完整的例子。 – 2013-03-13 12:13:49