我正在尝试打印某一章中的所有行。这是我到目前为止的一个主要方法,它接受用户输入的书名和章节号,然后将字符串拆分为将它们存储在单独的数据类型中以供程序使用,然后调用该方法。
private static List<String> list = new LinkedList<String>();
public static void main(String[] args) throws Exception{
//findDetailsByWordSearch();
Scanner scnr = new Scanner(System.in);
System.out.println("Please enter the name of the file you wish to search and the chapter number");
String input = scnr.nextLine();
String parts[] = input.split(" ");
int chapterNumber = Integer.parseInt(parts[parts.length -1]);
String bookName = "";
for (int i = 0; i < parts.length - 1; i++){
bookName += parts[i];
}
getChapter(bookName, chapterNumber);
}
接下来是使用来自用户的输入来查找您要查找的书籍的方法,将文本存储到arraylist中并获取章节编号但是,当前代码仅打印出一行但我需要它在“CHAPTER”+ chapterNumber指向之后打印出所有行,直到出现表示章节结束的空白。
public static void getChapter(String bookName, int chapterNumber) throws Exception{
String textExtension = ".txt";
String fileContent;
try {
BufferedReader reader = new BufferedReader(new FileReader(bookName +textExtension));
while ((fileContent = reader.readLine()) != null) {
list.add(fileContent);
}
for(int i = 0; i < list.size(); i++){
String lines = list.get(i);
if(lines.equals("CHAPTER "+chapterNumber)){
System.out.println(lines);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
章节遵循以下格式: 第1章(几行上的文字)后跟一个空白的空格第2章(几行文字)等等......所以问题是如何在找到章节之后打印文本,例如,如果用户正在搜索说'哈利4',系统会发现这本书是哈利并将文本读成一个arraylist然后找到第4章并打印出该章中的文本直到第5章。 谢谢!
答案 0 :(得分:0)
我建议您使用key作为chapterNumber维护一个映射,并且包含如下所示的章节的起始行和结束行号的数组:
int chapterStart = 1;
int chaperNumber = 1;
int lineNumber = 0;
while ((fileContent = reader.readLine()) != null) {
list.add(fileContent);
lineNumber ++;
if (fileContent.startsWith("Chapter") && lineNumber != 1) {
map.put(chaperNumber++, new int[] {chapterStart, lineNumber - 1});
chapterStart = lineNumber;
}
}
map.put(chaperNumber, new int[] {chapterStart, lineNumber - 1});//last chapter ends
然后给出chapterNumber,你可以用key作为chapterId读取map,你将得到起始行和结束行,你可以从列表中按位置获取行。
答案 1 :(得分:0)
实际上,您根本不需要将这些行读入List
。如果整个任务只是打印它们,那么你需要读取每一行,根据你的条件判断这条线是否是你想要打印的一行,如果是,只需打印它。
这将为您节省大量内存,特别是如果书籍很长。
那你怎么做的?您知道要打印以CHAPTER n
开头并以空行结束的行。所以当你读一行时,你会问自己:“这一行是本章的一部分吗?”显然,如果你还没有读过CHAPTER n
行,那就不行了。在您阅读CHAPTER n
后,答案是肯定的 - 除非您的行是空的。
因此,您要保留一个标记,说明您所在的州:阅读CHAPTER n
与否。首先,标志是错误的。
对于您阅读的每一行:
CHAPTER n
。如果是,请更改标志。这被称为“状态机”,您可以一次获得一个输入,但您的行为会因您的状态而异,并且该行为可能包括从一个状态转移到另一个状态。
boolean inChapter = false;
try (
BufferedReader reader = new BufferedReader(new FileReader(bookName +textExtension));
) {
while ((fileContent = reader.readLine()) != null) {
if ( inChapter ) {
if ( fileContent.isEmpty() ) {
return;
}
System.out.println( fileContent );
} else {
if ( fileContent.equals("CHAPTER "+chapterNumber ) {
inChapter = true;
System.out.println( fileContent );
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
请注意,我使用了“尝试使用资源”,这将自动关闭您的文件。