java - 为什么使用迭代器只读取文本文件的第一行
问题描述
接口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
解决方案
你的FileContent
类有一个charIterator
方法。它循环遍历每一行,并在该循环中返回。
所以,你的循环永远不会循环。
推荐阅读
- ios - 我可以强制应用程序一直停留在前台吗?
- aws-lambda - 为 aws lambda 层导出 yarn berry 中的 node_modules
- c++ - 标准::可选
:: 可以忽略变量的后续出现吗? - karate - 用于签到的空手道混合测试
- python - 如何确定可以从一袋字母和一袋单词python中组成的单词的数量和集合
- javascript - 为什么 Selenium-js 不发送回车键,即使 sendKeys 有效?
- google-apps-script - 谷歌表格宏;搜索时自动选择行(在工作表中查找)
- r - 您可以在 Quanteda 中将自定义标记添加到标记器(中文)吗?
- algorithm - 对传入日志进行排序的最佳和有效方法
- python - 如何单击 buster 按钮以使用 Python 和 selenium 解决 reCaptcha?