Java静态数组修改

Java静态数组修改,java,static,arrays,project,Java,Static,Arrays,Project,我有以下两个java类(如下所列)类BookInfo声明数组的静态块 public class BookInfo { // Global arrays accessible by all methods private static String[] isbnInfo; private static String[] bookTitleInfo; private static String[] authorIn

我有以下两个java类(如下所列)类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]);如何从主菜单修改(添加、删除、编辑等)?非常感谢您的任何想法和建议

我认为你需要重新考虑一下你的设计。我提供了一个示例,说明如何使某些功能与当前代码一起工作,但这样做会产生一些严重的代码

静态通常用于在实例之间共享信息,而这些信息是唯一的。通常的示例是作为实例计数器。因此,每次创建实例时,它都会增加值,以便您可以跟踪唯一的实例

问题是bookInfo不知道它是什么意思。它想成为一个数据存储,但也描述了一个独特的对象。想想如果你想创建另一个BookInfo会发生什么。编辑一个实例的任何静态属性都会影响其他实例

您可以轻松编辑静态字符串[]中的信息

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等。。。。, 这是许多不必要的迭代


下面的内容虽然不能解决您的问题,但它是一种更好的设计方法,将关注点划分为类

  • 一个类应该代表您的Book对象。此类将提供存储/设置/检索单个图书对象的所有数据的功能

    BookInfo newbook = new BookInfo(isbn, bookname, ...., wholesaleinfo)
    bookstore.addBook(newbook);
    
  • 另一个将代表书店,它将存储图书对象列表,使用图书初始化数据,提供从书店添加、删除和编辑图书的功能

    公共类图书信息{

     //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;
     }
    
     //.....
    
因此,现在您可以创建一个Book info并设置/获取其所有变量,并以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
    }
}
添加一本书需要用户输入更多的值,但本质上是相同的

String isbn = scanner.next();
String bookname = scanner.next();
.......
double wholesaleinfo = Double.ParseDouble(scanner.next());
然后您可以通过将信息作为参数传递来添加您的can

bookstore.addBook(isbn, bookname, ...., wholesaleinfo);
或者一本书

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

我会让用户逻辑按照您想要的方式进行。希望这能说明问题。我所做的工作肯定会有所改进。

我看到您也有一个关于堆栈溢出的帐户……您是否无意中在这里发布了此消息?您是否尝试过BookInfo.isbnInfo[0]=“新值”?应该可以
BookInfo newbook = new BookInfo(isbn, bookname, ...., wholesaleinfo)
bookstore.addBook(newbook);