2013-03-13 116 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