0

私は次のJavaクラスのうち2つを持っています(以下にリストされています)クラスBookInfoは配列の静的ブロックを宣言します

         public class BookInfo {

        // Global arrays accessible by all methods

        private static String[] isbnInfo;
        private static String[] bookTitleInfo;
        private static String[] authorInfo;
        private static String[] publisherInfo;
        private static String[] dateAddedInfo;;
        private static int[] qtyOnHandInfo;
        private static double[] wholesaleInfo;
        private static double[] retailInfo;

        static {

            isbnInfo = new String[] {

                                    "978-0060014018",
                                    "978-0449221431",
                                    "978-0545132060",
                                    "978-0312474881",
                                    "978-0547745527"

                                    };

            bookTitleInfo = new String[] {

                                    "The Greatest Stories",
                                    "The Novel",
                                    "Smile",
                                    "The Bedford Introduction to Drama",
                                    "AWOL on the Appalachian Trail"

                                    };

            authorInfo = new String[]  {

                                     "Rick Beyer",
                                     "James A. Michener",
                                     "Raina Telgemeier",
                                     "Lee A. Jacobus",
                                     "David Miller"

                                    };

            publisherInfo = new String[] {

                                    "HerperResource",
                                    "Fawcett",
                                    "Graphix",
                                    "Bedford St. Martins",
                                    "Mariner Books"

                                    };

            dateAddedInfo = new String[] {

                "05/18/2003", 
                "07/07/1992", 
                "02/01/2010", 
                "09/05/2008", 
                "11/01/2011"

                };

            qtyOnHandInfo = new int[] {7, 5, 10, 2, 8};

            wholesaleInfo = new double[] {12.91, 7.99, 6.09, 54.99, 10.17};

            retailInfo = new double[] {18.99, 3.84, 4.90, 88.30, 14.95};

        }

        public static void BookInfo() {

            System.out.println("             Serendipity Booksellers");
            System.out.println("                Book Information\n");       


            for(int i = 0; i < isbnInfo.length; i++){

                System.out.println("ISBN: " + isbnInfo[i]);
                System.out.println("Title: " + bookTitleInfo[i]);
                System.out.println("Author: " + authorInfo[i]);
                System.out.println("Publisher: " + publisherInfo[i]);
                System.out.println("Date Added: " + dateAddedInfo[i]);
                System.out.println("Quantity-On-Hand: " + qtyOnHandInfo[i]);
                System.out.println("Wholesale Cost: $ " + wholesaleInfo[i]);
                System.out.println("Retail Price: $ " + retailInfo[i]);
                System.out.println();

            }
        }
        }

このクラスから配列リストにアクセスするにはどうすればよいですか? これまでのところ、以下のみが機能していますが、このクラスから変更 (追加、削除、編集など) するにはどうすればよいですか (このクラスにはメインのメインはありません) BookInfo bookinfo = new BookInfo(); bookinfo.BookInfo(); System.out.println(bookinfo.isbnInfo[0]); メイン メニューから変更 (追加、削除、編集など) する方法

     import java.util.Scanner;

     public class InvMenu {
     public static void addBook(){

      System.out.println("\nYou selected Add a Book\n");
       BookInfo bookinfo = new BookInfo();
      bookinfo.BookInfo(); // only these two are working but I cannot modify arrays at all
      System.out.println(bookinfo.isbnInfo[0]);

        }

       public static void editBook(){

     System.out.println("\nYou selected Edit a Book's Record\n"); 

     }

     public static void deleteBook(){

      System.out.println("\nYou selected Delete a Book\n");

    }

    public static void printInvMenu(){

    String choice;
    int x = 0;
    boolean b;
    char letter;
    boolean menu = true;

    Scanner keyboard = new Scanner(System.in);

    System.out.println("Serendipity Booksellers");
    System.out.println("Inventory Database\n");
    System.out.println("       1. Look Up a Book");
    System.out.println("       2. Add a Book");
    System.out.println("       3. Edit a Book's Record");
    System.out.println("       4. Delete a Book");
    System.out.println("       5. Return to the Main Menu\n");

    do{

        System.out.print("Enter your choice: ");
        choice = keyboard.nextLine();
        b = true;

        try {
            x = Integer.parseInt(choice);
            System.out.println(x);

        }

        catch(NumberFormatException nFE) {

            b = false;
            System.out.println("You did not enter a valid choice. Try again!\n");

        }

           }while(b == false);

        do{

        else if(x == 1){

            addBook();

        }

        else if(x == 2){

            editBook();

        }

        else if(x == 3){

            deleteBook();

        }

        else if(x == 4){

            System.out.println("Returning to the Main Menu\n");
            break;

        }

        else{

            System.out.println("\nYou did not enter a valid choice. Try again!\n");

        }

        printInvMenu();

       }while(x == 5);

          }
         }

別のクラスのメイン メニューから一部の機能に簡単にアクセスできます。bookinfo.BookInfo(); System.out.println(bookinfo.isbnInfo[0]); メイン メニューから変更 (追加、削除、編集など) するにはどうすればよいですか? どんなアイデア、提案も大歓迎です!

4

1 に答える 1

2

デザインを少し考え直す必要があると思います。一部の機能を現在のコードで機能させる方法の例を含めましたが、そうすると、非常に厄介なコードが作成されます。

統計は通常、この情報が一意であることが意図されているインスタンス間で情報を共有するために使用されます。通常の例は、インスタンスカウンターとしてです。したがって、インスタンスが作成されるたびに値がインクリメントされるため、一意のインスタンスを追跡できます。

問題は、bookInfoがそれが何を意味するのかを知らないということです。データストアになりたいだけでなく、一意のオブジェクトについても説明します。別のBookInfoを作成したい場合はどうなるか考えてみてください。1つのインスタンスのスタティックを編集すると、他のインスタンスに影響します。

静的String[]の情報は簡単に編集できます。

public int getBookLocation(String name){
    return bookTitleInfo.IndexOf(name)
}

次に、特定のエントリを自由に操作できます。

public void SetBookName(String oldname, String newname){
    int index = getBookLocation(oldname);
    if(index > 0){
        bookTitleInfo[index] = newname;
}

これは編集にはそれほど悪くはありませんが、エントリの削除は非常に面倒です。ここにいくつかの擬似コードがあります

first have to find the bookindes. - getBookLocation(...)

For each entry in static string[]
    create a new one of size-1, 
        For each entry in String[]
            add existing entry to new string[].

アレイごとにそれを行う必要があります。つまり、isbnInfo、bookInfoName、....、それは多くの不必要な反復です。


以下は、あなたの質問を解決することはできませんが、関心の分離をクラスに分ける、より良い設計アプローチです。

  • 1つのクラスはブックオブジェクトを表す必要があります。このクラスは、単一のブックオブジェクトのすべてのデータを保存/設定/取得する機能を提供します。

  • もう1つは、本のオブジェクトのリストを格納し、本でデータを初期化し、ストアから本を追加、削除、編集する機能を提供する書店を表します。

    パブリッククラスBookInfo{

     //Class variables
     private String isbnInfo;
     private String bookTitleInfo;
     //....
     private double wholesaleInfo;
     private double retailInfo;
    
     //Constructors
     BookInfo(){
         //put default behaviour here
     }
    
     BookInfo(String isbnInfo, String bookTitleInfo, .....){
         this.isbnInfo = isbnInfo;        
         this.bookTitleInfo = bookTitleInfo;
         this.authorInfo = authorInfo;
    
         //....
    
    
     //Setter Method
     public String getIsbnInfo(){
         return isbnInfo;
     }
    
     //Getter Method
     public void setBookTitleInfo(String isbnInfo){
         this.isbnInfo = isbnInfo;
     }
    
     //.....
    

これで、ブック情報を作成し、そのすべての変数をOOP方式でカプセル化して設定/取得できます。

次に、BookInfosのストレージ/アクセスクラスを見ていきます。

public class BookStore {
    private isbnInfo = new String[] {"978-0060014018", "978-0449221431", "978-0545132060",
                                "978-0312474881", "978-0547745527" };
    
    private bookTitleInfo = new String[] { "The Greatest Stories", "The Novel", "Smile",
                                "The Bedford Introduction to Drama", 
                                 "AWOL on the Appalachian Trail" };

    //...rest of strings

    //here is where we store our book objects
    //we will create methods to add, remove, edit, later
    private BookInfo booklist = new List<BookInfo>();
    private String storename;
    
    //Default Constructor initialises booklist based on stored values
    public BookStore(){
         for(int i = 0; i < isbnInfo.lenght; i++){
             AddBook(isbnInfo [i], bookTitleInfo[i],.....,retailInfo[i]);
         )
    }
    
    //overloaded constructors you probably want to read from external file, db, etc eventually.
    public BookStore(String filelocation){
         //Do stuff to read from a file and add books to booklist 
    }
    
    //Add a new book to the list by passing in all the info
    public void AddBook(String isbn, String title, 
         BookInfo newbook = new BookInfo(isbn, title, ....)
         booklist.add(newbook);
    
    //Add a new book by passing in a book object.
    public void AddBook(BookInfo newbook){
         booklist.add(newbook);
    }
       
    //Find Book
    public int getBook(String isbn){
        for(int i=0; i++; i < booklist.lenght){
            if(book.getIsbn() == isbn)
                return i;
        }
        return -1;
    
    //Remove Book from list
    public void removeBook(String isbn){
         int loc = getbook(isbn);
         if(loc > -1){
             booklist.remove(loc);
         }
         else{
             System.out.println(Could not find book);
         }
    }     
    
    public void DisplayBookList(){
    //.. print list
    }
}

これで、BookStoreに必要なすべての機能が、必要な場所に配置されました。これで、必要に応じて機能を追加できます。

メインのドライバークラスも変更する必要があります。ドライバークラスはBookStoreを作成する必要があります。

ユーザーが本を削除したい場合は、本の名前を入力します。次に電話します

bookstore.removeBook(userstring);

本を追加するには、ユーザーはさらに多くの値を入力する必要がありますが、基本的には同じです

String isbn = scanner.next();
String bookname = scanner.next();
.......
double wholesaleinfo = Double.ParseDouble(scanner.next());

次に、情報をパラメータとして渡すことにより、缶を追加します

bookstore.addBook(isbn, bookname, ...., wholesaleinfo);

または本のオブジェクト。

BookInfo newbook = new BookInfo(isbn, bookname, ...., wholesaleinfo)
bookstore.addBook(newbook);

ユーザーロジックは好きなように任せます。うまくいけば、それは物事を説明しています。確かに、私が行ったことに対して行うことができる改善があります。

于 2012-10-19T09:36:30.320 に答える