如何在java中的某个字符串后打印出行?

时间:2014-12-14 14:04:08

标签: java

我正在尝试打印某一章中的所有行。这是我到目前为止的一个主要方法,它接受用户输入的书名和章节号,然后将字符串拆分为将它们存储在单独的数据类型中以供程序使用,然后调用该方法。

    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章。 谢谢!

2 个答案:

答案 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();
  }

请注意,我使用了“尝试使用资源”,这将自动关闭您的文件。