首页 > 解决方案 > 为什么使用迭代器只读取文本文件的第一行

问题描述

接口IterableText。

package main;

import java.util.Iterator;

public interface IterableText {

Iterator<String> charIterator();
Iterator<String> wordIterator();
}

FileContent - 负责读取文本文件的类。通过方法charIterator()和提供的内容wordIterator()

我在 FileCONntent 类中创建了静态函数 main,因为我想要测试程序并检查是否一切正常......

package main;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.Array;
import java.util.ArrayList; 
import java.util.Arrays;
import java.util.Iterator;
import java.util.ListIterator;

public class FileContent implements IterableText{

public String pathToFile;
public ArrayList<String> splittedLetters;
public ArrayList<String> splittedWords;

public FileContent(String pathToFile){
    this.pathToFile = pathToFile;
    this.splittedLetters = new ArrayList<String>();
    this.splittedWords = new ArrayList<String>();
}

public Iterator<String> charIterator(){
    try (BufferedReader br = new BufferedReader(new                                                                                                          FileReader(this.pathToFile))) {
        String line;
        while ((line = br.readLine()) != null) {
            String[] splittedText = line.split("");


            for(String letter: splittedText){
                if(!letter.equals(" ")){
                    splittedLetters.add(letter);
                }
            }

            Iterator<String> itr = splittedLetters.iterator();


            while(itr.hasNext()){
                return itr;
            }
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

public Iterator<String> wordIterator(){
    try (BufferedReader br = new BufferedReader(new FileReader(this.pathToFile))) {
        String line;
        while ((line = br.readLine()) != null) {
            String[] splittedText = line.split(" ");

            System.out.println(Arrays.toString(splittedText));
            for(String word: splittedText){
                if(!word.equals(" ")){
                    splittedWords.add(word);
                }
            }

            Iterator<String> itr = splittedWords.iterator();



            while(itr.hasNext()){
                return itr;
            }
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

public String getFilename(String[] args){
    return args[2];
}


public static void main(String[] args){
    FileContent fileContent = new FileContent("/home/hubert/IdeaProjects/TextAnalysis/src/main/test.txt");
    CharIterator charIterator = new CharIterator(fileContent);

    Iterator<String> itr = fileContent.charIterator();

    while(itr.hasNext()){
        String element = itr.next().toLowerCase();
        System.out.print(element + ", ");
    }

}
}

CharIterator 迭代文本的字母。从 Iterator 接口实现 next() 和 hasNext()。

package main;

import java.util.Iterator;
import java.util.List;
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;

public class CharIterator {

public FileContent fileContent = new FileContent("/home/hubert/IdeaProjects/TextAnalysis/src/main/test.txt");
public int currentIndex = 0;

Iterator<String> itr_string = fileContent.charIterator();
public List<String> ListLetters = StreamSupport.stream(Spliterators.spliteratorUnknownSize(itr_string, Spliterator.ORDERED), false).collect(Collectors.<String> toList());
public String[] arrayLetters = ListLetters.toArray(new String[ListLetters.size()]);

public int currentSize = arrayLetters.length;



public CharIterator(FileContent fileContent){
    this.fileContent = new FileContent(fileContent.pathToFile);
}

public boolean hasNext(){
    return currentIndex < currentSize && arrayLetters[currentIndex] != null;
}

public String next(){
    return arrayLetters[currentIndex++];
}
}

WordIterator 迭代文本的单词。从 Iterator 接口实现 next() 和 hasNext()。

package main;

import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;

public class WordIterator {

public FileContent fileContent = new FileContent("/home/hubert/IdeaProjects/TextAnalysis/src/main/test.txt");
public int currentIndex = 0;


Iterator<String> itr_string = fileContent.charIterator();
public List<String> ListWords = StreamSupport.stream(Spliterators.spliteratorUnknownSize(itr_string, Spliterator.ORDERED), false).collect(Collectors.<String> toList());
public String[] arrayWords = ListWords.toArray(new String[ListWords.size()]);

public int currentSize = arrayWords.length;


public WordIterator(FileContent fileContent){
    this.fileContent = new FileContent(fileContent.pathToFile);
}

public boolean hasNext(){
    return currentIndex < currentSize && arrayWords[currentIndex] != null;
}

public String next(){
    return arrayWords[currentIndex++];
}
}

你能告诉我为什么在迭代时我只得到文本文件的第一行吗?最后每一行都是符号:\n

标签: javafiletextiterator

解决方案


你的FileContent类有一个charIterator方法。它循环遍历每一行,并在该循环中返回。

所以,你的循环永远不会循环。


推荐阅读