특정 장의 모든 줄을 인쇄하려고합니다. 이것이 제가 지금까지 가지고있는 것입니다. 책 이름과 장 번호를 사용자가 입력 한 다음 문자열을 분할하여 프로그램이 사용할 별도의 데이터 유형으로 저장 한 다음 메서드를 호출하는 주요 방법입니다.
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);
}
다음은 사용자의 입력을 사용하여 찾고있는 책을 찾고, 텍스트를 배열 목록에 저장하고 장 번호도 가져 오는 방법입니다. 그러나 현재 코드는 해당 한 줄만 인쇄하지만 인쇄하려면이 방법이 필요합니다. "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();
}
}
장은 다음과 같은 형식을 따릅니다. CHAPTER 1 (여러 줄에있는 텍스트) 뒤에 공백이있는 CHAPTER 2 (여러 줄에있는 텍스트) 등등 ... 그래서 문제는 장 뒤와 뒤에있는 텍스트를 어떻게 인쇄 할 것인가입니다. 예를 들어, 사용자가 'Harry 4'를 검색하는 경우 시스템은 harry 책을 찾아서 배열 목록으로 텍스트를 읽은 다음 CHAPTER 4를 찾아서 CHAPTER 5까지 해당 장의 텍스트를 인쇄합니다. 감사합니다!
사실, 당신은 라인을 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();
}
파일을 자동으로 닫는 "리소스로 시도"를 사용했습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다