本カタログをシミュレーションするために設計されたいくつかのクラスがあります。本クラス(isbn、タイトルなど)、BookNodeクラス、本のLinkedListであるBookCatalog、およびドライバークラス(gui)があります。私の問題は、すべての本の文字列表現を返すことになっているBookCatalogにtoString()メソッドがあることです。 BookクラスはtoString()もオーバーライドします。本の各フィールドを「タブ」で区切り、各本を「改行」で区切る必要があります。 PrintStreamを使用して書籍カタログを.txtファイルに印刷しようとすると、\ nが登録されません。
ブックカタログを正しく表示するSystem.getProperty(line.separator)に変更しようとしました。しかし今、スキャナーがファイルを正しく読み取らず、「NoSuchElementException」をスローするという問題があります。スキャナーを1)line.separatorを無視するか、2)printStreamで\ nを使用するにはどうすればよいですか?
Book.Java
public String toString(){
return isbn+"\t"+lastName+"\t"+firstName+"\t"+title+"\t"+year+"\t"+
String.format("%.2f",price);
BookCatalog.Java
public String toString() {
BookNode current = front;
String s="";
System.out.println(s);
while (current!=null){
//each book is listed on separate line
s+=current.getData().toString()+"\n ";//System.getProperty("line.separator")
current = current.getNext();
}
return s;
}
Driver.Java
public void loadDirectory() throws FileNotFoundException {
if (f.exists()){
Scanner input = new Scanner(f);
while (input.hasNextLine()){
String bookLine = input.nextLine();
processBookLine(bookLine);
}
}
}
public void processBookLine(String line){
Scanner input = new Scanner(line);
String isbn = input.next();
String lastName = input.next();
String firstName = input.next();
String title = input.next();
while (input.hasNext() && !input.hasNextInt()){//while next token is not an integer
title += " "+input.next();
}
int year = input.nextInt();
double price = input.nextDouble();
Book book = Book.createBook(isbn, lastName, firstName, title, year, price);
if (book!=null){
catalog.add(book);
}
}
改行文字_\n
_は、特定のオペレーティングシステム(「\ r\n」であるウィンドウなど)の行区切り文字ではありません。代わりに_\r\n
_を使用することをお勧めします。 _\n
_と_\r\n
_のみの改行を参照してください。これを使用しても問題はありません。
また、BookCatalog.toString()
のwhileループでStringBuilder
を連結する代わりにString
の使用を検討する必要があります。これははるかに効果的です。例えば:
_public String toString() {
BookNode current = front;
StringBuilder sb = new StringBuilder();
while (current!=null){
sb.append(current.getData().toString()+"\r\n ");
current = current.getNext();
}
return sb.toString();
}
_