2012-02-03 55 views
2

我們有創建自定義的迭代器讀取連續的文件

public class UKWacSentenceIterator implements SentenceIterator 

這顯然是一個Tterator,但我沒有對什麼是在SentenceIterator的任何信息。這個班有這個屬性:Scanner fileScanner

的想法是,構造函數接受文件的數組:

public UKWacSentenceIterator() throws IOException { 
    Properties p = new Properties(); 
    p.load(prop.class.getClassLoader() 
      .getResourceAsStream("sources/ukwacdump.properties")); 
    Enumeration<Object> keys = p.elements(); 
    while (keys.hasMoreElements()) { 
     source.add(keys.nextElement()); 
    } 
    fileScanner = new Scanner(new File((String) source.get(0))); 
} 

,並在主方法,我們可以用一個for循環:

public static void main(String[] args) throws IOException { 
    for(String line : new UKWacSentenceIterator()) { 
     System.out.println(line); 
    } 
} 

他目前已經有這個問題for循環,因爲一旦第一個文件是EOF就停止。於是,他以爲會是一個好主意,覆蓋

@Override 
public boolean hasNext() { 
    if(tmp != null) { 
     return true; 
    } 
    if (this.fileScanner.hasNext()) { 
     try { 
      this.skipToSequenceStart(); 
      String sent = this.scanSentence(); 
      this.tmp = sent; 
      return true; 
     } catch (Exception e) { 
      return false; 
     } 
    } else { 
     return advanceFileScanner(); 
    } 
} 

但他不知道如何建立advanceFileScanner()

我的想法是隻是爲了下一個文件名可變fileScanner分配給新Scanner,然後只複製

this.skipToSequenceStart(); 
String sent = this.scanSentence(); 
this.tmp = sent; 
return true; 

我不知道他是否試過沒。我想知道如果你認爲這是一個好主意,並且如果你可以建議我一個關於如何創建一個可迭代對象的好教程。因爲現在我只是猜測,我不知道hasNext()以外的for循環使用了什麼。

回答

0

我不知道,但不是你的問題只是你

fileScanner = new Scanner(new File((String) source.get(0))); 

只包含1個文件

我解釋。我使用閱讀許多文件給定一個字符串數組,我必須閱讀所有文件。我,我這樣做,我只是聲明爲[]。我給你一個我的代碼的例子。

BufferedReader[] reader = new BufferedReader[myArrayFiles.length]; 
for (int i = 0; i < myArrayFiles.length; i++) { 
    reader[i] = new BufferedReader(new FileReader(myArrayFile[i])); 
    //do my reading 
    reader.close(); 
} 

這是與緩衝讀者,但我認爲你可以將它應用到你的代碼。你能做這樣的事情嗎(是源數組?我假設是,所以我使用長度,也許它是在你的情況「大小()」)。

Scanner[] fileScanner = new Scanner[source.length()]; 
for (i = 0; i < source.length(); i++) { 
    fileScanner[i] = new Scanner(new File((String) source.get(i))); 
} 

然後,當然,你必須重構代碼的其餘部分漢德爾filescanner陣列

希望它可以幫助

+0

我不認爲會有那麼多不同。在我的朋友的情況下,他只更新他擁有的唯一文件掃描器。新的文件掃描儀將位於advanceFileScanner方法內,也許使用計數器。我真正感興趣的是從for循環獲取所需信息的位置。 – dierre 2012-02-03 09:40:56