创建读取连续文件的自定义迭代器

时间:2012-02-03 08:59:44

标签: java iterator

我们有

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)));
}

在main方法中我们可以使用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循环使用了什么。

1 个答案:

答案 0 :(得分: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();
}

它是缓冲读卡器,但我认为您可以将它应用于您的代码。你可以做那样的事情(源数组吗?我假设是的,所以我使用长度。也许你的情况是“size()”。

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

然后当然你必须重构其余的代码来handel filescanner数组

希望有所帮助