1

私はJavaの初心者ですが、メインクラスのオブジェクトの名前を入力で変更する方法があるかどうか疑問に思っていましたか? たとえば、次のコードを取得しました。

while(!answer.equals("stop"))
    {
    //Enters book's information  and stores it in the object book1  
    System.out.println("Book-" + count);    
    title = input.next();
    author = input.next();
    ISBN = input.next();
    copies = input.nextInt();
    Book book1 = new Book(title,author, ISBN, copies);
    printLn("");
    printLn("Do you wish stop adding books? N || stop");      
    answer = input.next();
    }

プロンプトが表示されたら書き込みを停止するまで新しい本を追加し続けたいのですが、もちろん名前を変更せずに同じオブジェクトにデータを追加し続けます。可能ですか、それとも新しい本オブジェクトを作成し続ける必要がありますか? Book etc = new Book(title,author,ISBN, copies)

「私のコードの修正」 ケビンが述べたように、配列はこれらの値を格納するための主なアイデアですが、静的な値のためにいっぱいになる可能性がありますが、n-books が入力され、配列がいっぱいになったときに expandcapacity メソッドを使用できます配列を x サイズで展開します。ありがとうございました!

4

1 に答える 1

7

コードでは、後でコード内でアクセスできるように、各本を List に格納する必要があります。名前は、コード内でオブジェクトを識別すること以外には重要ではありません。ローカル変数の名前を変更できたとしてもbook、問題は残ります。

発生する問題は、スコープとオブジェクト インスタンスに関連しています。呼び出すnew Book(..)と、ブックの新しいインスタンスが作成されます。{}book のスコープのこのインスタンスは、while ループによって実行されるコード ブロックに限定されます。これは、ループの外では book のインスタンスにアクセスできないことを意味します。

ループの外側で book のインスタンスにアクセスするには、次のようにループの外側で book を作成できます。

Book book;

while(...){
   book = new Book(...);
}

この方法の問題点は、book の複数のインスタンスを作成しているため、ループの反復ごとに book への参照が最新の book で上書きされることです。

これにより、複数の本を保持する必要が生じます。すぐに配列が頭に浮かぶかもしれませんが、配列のサイズは静的であり、ユーザーは 1..n 本を入力する可能性があります。これでは、ブックを格納するのに配列は適していません。

ここでListArrayListが活躍します。AListは、複数のオブジェクト インスタンスを保持するデータ構造です。add(Object)メソッドを使用して簡単に拡張できます。List と ArrayList の完全な説明はこの回答の範囲を超えていますが、次のリソースを提供しています: http://docs.oracle.com/javase/tutorial/collections/

最終的解決

    List<Book> books = new ArrayList<Book>();
    while(!answer.equals("stop"))
        {
        //Enters book's information  and stores it in the object book1  
        System.out.println("Book-" + count);    

        title = input.next();
        author = input.next();
        ISBN = input.next();
        copies = input.nextInt();

        Book book1 = new Book(title,author, ISBN, copies);
        books.add(book1);

        printLn("");
        printLn("Do you wish stop adding books? N || stop");      
        answer = input.next();
     }

     //Iterating the book list outside the loop
     for(Book book:books){
       //this call may vary depending on the book implementation
       System.out.println(book.getTitle());
     }
于 2013-04-20T22:26:37.133 に答える