java - 创建一个读取连续文件的自定义迭代器

标签 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 for 就会停止。所以他认为覆盖是个好主意

@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 循环使用了什么。

最佳答案

我不确定,但你的问题不只是你的

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

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

希望对你有帮助

关于java - 创建一个读取连续文件的自定义迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9126033/

相关文章:

Java 代码在 Intellij Idea 中工作,但在构建工件后无法工作 JAR 文件

java - 通过java运行Kettle转换

java - 流程 Pane 和定位

存储在 std::map 中的 C++ 基本迭代器

c++ - 如何检查传递的迭代器是随机访问迭代器?

java - 在 Mockito 中模拟迭代器类时遇到问题

java - 如何在 Firebase 中检索已推送给子级的最新数据?

java - MongoJack 未找到对象

perl - "Statement modifier"哈希迭代?

c++ - 使用迭代器插入字符串的特定部分? (C++)