10

本のカタログをシミュレートするように設計されたクラスがいくつかあります。ブック クラス (isbn、タイトルなど)、BookNode クラス、ブックの LinkedList である BookCatalog、およびドライバー クラス (gui) があります。私の問題は、すべての本の文字列表現を返すはずの BookCatalog に toString() メソッドがあることです。Book クラスも toString() をオーバーライドします。本の各フィールドは「タブ」で区切られ、各本は「改行」で区切られているはずです。PrintStream を使用して書籍カタログを .txt ファイルに出力しようとすると、\n が登録されません。

bookcatalog を正しく表示する 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);
        }
    }
4

1 に答える 1

31

改行文字\nは、特定のオペレーティングシステム(「\ r \ n」であるWindowsなど)では行区切り文字ではありません。代わりに使用することをお勧めします。代わりに、と、I\r\nだけで改行が表示されます。'それを使用して問題が発生したことはありません。\n\r\n

また、whileループでをStringBuilder連結する代わりに、を使用することを検討する必要があります。これは、はるかに効果的です。例えば:StringBookCatalog.toString()

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();
}
于 2013-03-19T23:29:57.033 に答える