【问题标题】:Creating a custom iterator that reads consecutive files创建一个读取连续文件的自定义迭代器
【发布时间】:2012-02-25 21:59:36
【问题描述】:

我们有

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

【问题讨论】:

    标签: java iterator


    【解决方案1】:

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

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

    当然你必须重构其余的代码来处理文件扫描器数组

    希望对你有帮助

    【讨论】:

    • 我认为不会有太大的不同。就我的朋友而言,他只是在更新他唯一的文件扫描仪。新的文件扫描器将在 AdvanceFileScanner 方法中,可能使用计数器。我真正感兴趣的是了解 for 循环从何处获取所需信息。
    猜你喜欢
    • 1970-01-01
    • 2020-09-27
    • 2011-07-09
    • 2017-10-03
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 2021-10-15
    • 2018-04-14
    相关资源
    最近更新 更多