2012-10-19 2 views
0

У меня есть два из следующих классов Java (перечисленных ниже) Класс BookInfo объявляет статический блок массивовJava изменения статического массива

  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 = новый BookInfo(); bookinfo.BookInfo(); System.out.println (bookinfo.isbnInfo [0]); Как изменить (добавить, удалить, отредактировать и т. Д.) В главном меню? Любые идеи, предложения очень ценятся!

+0

Я вижу, что у вас есть учетная запись на переполнении стека ... Вы случайно опубликовали это здесь? – Soviero

+0

Вы пытались BookInfo.isbnInfo [0] = "новое значение"? которые должны работать – user902383

ответ

2

Я думаю, вам нужно немного переосмыслить свой дизайн. Я включил пример того, как получить некоторые функции, работающие с вашим текущим кодом, но при этом создаст какой-то серьезный неприятный код.

Статики обычно используются для обмена информацией между экземпляром, где эта информация предназначена для уникальности. Обычный пример - это счетчик экземпляров. Поэтому каждый раз, когда создается экземпляр, он увеличивает значения, чтобы вы могли отслеживать уникальный экземпляр.

Проблема в том, что bookInfo не знает, что это значит быть. Он хочет быть хранилищем данных, но также описывает уникальный объект. Подумайте, что произойдет, если вы хотите создать другую BookInfo. Редактирование любого статического элемента одного экземпляра повлияет на остальных.

Вы можете легко редактировать информацию в статической строке [].

public int getBookLocation(Sting 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, ...., Это много ненужной итерации.


Следующие, хотя и не решит ваш вопрос, - это лучший подход к дизайну, разделяющий проблемы на класс.

  • Один класс должен представлять ваш объект книги. Этот класс обеспечит функциональность для хранения/установки/извлечения всех данных для одного объекта книги.
  • Другой будет представлять книжный магазин, в котором будет храниться список объектов книги, инициализировать данные с помощью книг, предоставлять функциональность для добавления, удаления, редактирования книг из магазина.

    общественного класса 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; 
    } 
    
    //..... 
    

Итак, теперь вы можете создать данные книги и установить/получить все свои переменные, инкапсулированные в ООП манере.

Далее мы рассмотрим класс хранения/доступа 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()); 

Затем добавить банку либо путем передачи информации, как в PARAMS

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

или объект книги.

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

Я оставлю логику пользователя так, как вы хотите. Надеюсь, это проиллюстрировало ситуацию. Есть, безусловно, улучшения, которые могут быть сделаны в отношении того, что я сделал.

Смежные вопросы