1

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

     public class BookInfo {

    // Global arrays accessible by all methods

    public static String[] isbnInfo;
    public static String[] bookTitleInfo;
    public static String[] authorInfo;
    public static String[] publisherInfo;
    public static String[] dateAddedInfo;;
    public static int[] qtyOnHandInfo;
    public static double[] wholesaleInfo;
    public 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);

      }
     }

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

4

5 に答える 5

3

配列を作成した後は、配列に新しい要素を「追加」することはできません。オラクルのチュートリアルページから:

配列は、単一の型の値の固定数を保持するコンテナオブジェクトです。配列の長さは、配列の作成時に確立されます。作成後、その長さは固定されます。

したがって、リストに要素を追加したりリストから要素を削除したりする場合は、ArrayListオブジェクトを使用することをお勧めします。これは次のように定義できます。

Listインターフェースのサイズ変更可能な配列の実装。

たとえば、コード行を置き換えることができます

private static String[] isbnInfo;

にとって

private static ArrayList<String> isbnInfo;

次のように初期化します。

isbnInfo = new ArrayList<String>()
isbnInfo.add("978-0060014018");
isbnInfo.add("978-0449221431");
isbnInfo.add("978-0545132060");
isbnInfo.add("978-0547745527");

配列の編集に関しては、プライベートフィールドにパブリックゲッターを追加するだけです。

public static String[] getIsbnInfo()
{
   return isbnInfo;
}

そしてあなたのパブリッククラスで:

String[] isbnInfo = BookInfo.getIsbnInfo();

次のように、パブリックメソッドを使用して配列を編集することもできます。

public static void replaceIsbnInfo(int index, String isbn)
{
   isbnInfo[index] = isbn;
}

そしてあなたのメニュークラスで

BookInfo.replaceIsbnInfo(1, "978-0547745527");

お役に立てば幸いです。乾杯!

于 2012-10-19T01:01:10.517 に答える
1

あなたはちょっとこのことをいじくりまわしました。

最初に、isbnInfo、bookTitleInfo、authorInfoなどのインスタンスフィールドを含む「BookInfo」クラス(定義したクラスではない)を作成する必要があります(配列ではなく、フィールドごとに1つのブックに対して1つのエンティティのみ)。

次に、本ごとに、対応するBookInfoオブジェクトを作成して初期化します。

次に、そのようなBookInfoオブジェクトのコレクションをHashMapなどの検索可能なオブジェクト(単一の検索フィールド用)に配置するか、それらをある種の配列に配置して、個別のHashMapまたは検索引数から配列インデックスにマップするものを作成します(すべてのピースを「Library」オブジェクトに固定します)。

誰かが本を検索するときは、BookInfoオブジェクトを返します。このオブジェクトには、(理想的にはプライベートな)インスタンスフィールド値を抽出するための「getter」メソッドがあります。これにより、本に関するすべての情報が1つのピースに返されます。

于 2012-10-19T01:18:39.327 に答える
0

配列をプライベートとして宣言したので、それらはプライベートです。それぞれの配列を返すには+アクセサメソッド+を作成する必要があります。または、個々の配列エントリにアクセス、検索、変更などを行うメソッドをよりエレガントに作成する必要があります。

于 2012-10-19T00:53:09.910 に答える
0

私が正しく理解している場合は、配列の値、または別のクラスファイルからその問題に関する変数/関数にアクセスしたいですか?

ClassName.VariableName = whatever;

使用する場合

ClassName variable = new ClassName();

呼び出すたびにそのクラスを実行します。変数が

public static VariableType Variablename;

またはあなたはそれを呼び出す/変更することができなくなります

于 2012-10-19T00:56:09.627 に答える
0

ArrayListは、すべてのオプションの中で最も柔軟なようです。効果的なJava2ndEdition、アイテム25:配列よりもリストを優先します。ご入力いただきありがとうございます。

于 2012-10-19T03:47:58.930 に答える