首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >图书馆程序中图书的状态分配

图书馆程序中图书的状态分配
EN

Stack Overflow用户
提问于 2015-12-09 22:22:28
回答 2查看 2K关注 0票数 0

我是java的新手,对代码中的不一致/混乱感到非常抱歉。

我正在创建一个简单的图书馆程序,其中一个要求是显示图书馆中的所有书籍及其状态(无论在里面还是向外)。

例如:

远大期望: 风筝追逐者:出局 呼啸山庄:出去

但是,如果我只检查了一本书,它就会将所有的图书状态更改为" out“,而不是其中的一本。举个例子,我一直在想:

远大期望:出局 风筝追逐者:出局 呼啸山庄:出去

在我的图书类中,我有类似的状态设置器/getter,还有一个保存所有库书籍的ArrayList BookList。

代码语言:javascript
复制
static ArrayList <String> BookList = new ArrayList <String> ();

public static String getStatus(String book)
    {
        return status; 
    }

  public static void setStatus(String newStatus)    
    {
        status = newStatus; 
    }

这是赞助类的借阅书籍的方法。

代码语言:javascript
复制
public static void CheckOutBook() 
{
      Scanner inputread = new Scanner(System.in);
      Scanner input = new Scanner(System.in);
      System.out.println("Enter full patron name: ");
      String borrower = inputread.nextLine();
      System.out.println("Enter book title to check out: ");
      String bookCheckOut = inputread.nextLine();

      if (Book.BookList.contains(bookCheckOut)) 
      {
        Book.BookList.remove(bookCheckOut);
        Book.setStatus("OUT");                   //?? doesnt work ??
        int bookIndex = Book.getIndexNumber(bookCheckOut);
        Book.setTrue(Book.BookList.get(bookIndex));
        Book.setBook(Book.BookList.get(bookIndex));
        Book.setBorrower(borrower);
        Book.setBook(bookCheckOut);
        System.out.println("----------" + bookCheckOut + " has been checked out!----------");

      }
}

如何才能使数组列表中只有指定的书籍更改其状态?我试图创建不同的方法,但这似乎也不起作用:

代码语言:javascript
复制
Book.setTrue(bookCheckOut);              //true if book checked out
Book.BookList.get(indexNum).setTrue(bookCheckOut);
Book.setTrue(Book.BookList.get(i));

//here are some of the other attemps ive tried but they still dont change anything :(

图书班:

代码语言:javascript
复制
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

public class Book implements BookInterface {
  Scanner input = new Scanner(System.in);

  static ArrayList < String > UserList = new ArrayList < String > ();
  static ArrayList < String > BookList = new ArrayList < String > (); //display just titles// use when checking out books
  static ArrayList < String > OrigBookList = new ArrayList < String > (); //keep track of all titles ever entered

  public static String title;
  public String author;
  public static String book;
  public boolean checkIn;

  public static String status;
  public static String borrower;


  public Book(String t, String a) {
    title = t;
    author = a;
  }


  //constructor create new book
  public Book(String newTitle) {
    title = newTitle;
  }


  public String toString() {
    return title + " " + author;
  }

  public String getTitle() {
    return title;
  }

  public void setTitle(String title) {
    this.title = title;
  }

  public String getAuthor() {
    return author;
  }

  public void setAuthor(String author) {
    this.author = author;
  }

   public static String getStatus(String book) {
    return status;
  }

  public static void setStatus(String newStatus) 
    {
      status = newStatus;


  /**public static void setStatus(String newStatus)
    {
        status = newStatus; 
    }**/

  public static void setTrue(String bookCheckOut) {
    //status = true; 
  }

  public static void setFalse(String bookCheckIn) {
    //status = false; 
  }

  public static void setBorrower(String newBorrower) {
    borrower = newBorrower;
  }

  public static String getBorrower(String checkPatron) {
    return borrower;
  }

  public static String getBook(String checkPatron) {
    return book;
  }

  public static void setBook(String newBook) {
    book = newBook;
  }

  public static void addBook() {
    Scanner input = new Scanner(System.in);
    Scanner inputread = new Scanner(System.in);
    System.out.print("Enter book title: ");

    String title1 = inputread.nextLine();

    Scanner input1 = new Scanner(System.in);
    System.out.print("Enter book author: ");
    String author1 = inputread.next();

    Book fullBook = new Book(title1, author1); //create constructor w/ title & author
    Book book1 = new Book(title1); //constructor w/ just title to be used to display all books
    BookList.add(title1);
    OrigBookList.add(title1);
    //setStatus("IN");  //false = checked in 
    setFalse(title1);
    System.out.println("-----------------------------------------------");
    System.out.println("-----" + title1 + " is now in the library!-----");
    System.out.println("-----------------------------------------------");
  }

  public static void editBook() {
    Scanner inputread = new Scanner(System.in);
    System.out.println("Enter original book title: ");
    String origTitle = inputread.nextLine();
    System.out.println("Enter edited book title: ");
    String editedTitle = inputread.nextLine();
    Collections.replaceAll(Book.UserList, origTitle, editedTitle);
    System.out.println("------------------------------------------------------");
    System.out.println(origTitle + " has been changed to " + editedTitle + "!");
    System.out.println("------------------------------------------------------");

  }


  //print out list of books & if checked in or out
  public static void libraryInventory() {
    for (int i = 0; i <= OrigBookList.size() - 1; i++) {
      //Book Title: checked in/out
      System.out.println(OrigBookList.get(i) + ":" + getStatus(OrigBookList.get(i)));
    }
  }

  //method to go through BookList array and get index number for specifed 
  //book user has entered to check in/out 
  public static int getIndexNumber(String bookCheckOut) {
    int bookIndex = 0;
    for (int i = 0; i <= BookList.size() - 1; i++) {
      if (BookList.get(i).equals(bookCheckOut)) {
        bookIndex = i;
      }

    }
    return bookIndex;

  }

}
EN

回答 2

Stack Overflow用户

发布于 2015-12-11 00:11:35

对于您的getStatus方法来说,您使用的是一个静态变量,这意味着它在所有图书实例中都是相同的,您不希望这样,只需从Book中的变量和方法中删除所有的静态变量,它就会正常工作。

票数 1
EN

Stack Overflow用户

发布于 2015-12-11 03:08:41

为了建模您的“库”,您需要有图书的实例。将您的Book类看作是定义书籍的蓝图。然后,您需要使用此蓝图来创建实际的Book对象。

保持简单,这里是一个Book类的例子。它定义了一个具有标题和签出状态的图书。

代码语言:javascript
复制
public class Book {
  private String title;
  private boolean isCheckedOut;
  public Book(String title, boolean isCheckedOut) {
    this.title = title;
    this.isCheckedOut = isCheckdOut;
  }

  public void setTitle(String title) {
    this.title = title;
  }
  public String getTitle() {
    return title;
  }
  public void setCheckedOut(boolean isCheckedOut) {
    this.isCheckedOut = isCheckedOut;
  }
  public boolan isCheckedOut() {
    return isCheckedOut;
  }
  @Override
  public String toString() {
    return title + ": " + (isCheckedOut ? "OUT" : "IN");
  }
}

您可以创建这样的特定书籍:

代码语言:javascript
复制
Book greatExpectations = new Book("Great Expectations", false);

这就创建了一本名为“远大期望”的新书,而这本书并没有被检出。System.out.println(greatExpectations)会打印Great Expectations: OUT

因此,为了设置您的“库”,让我们创建一个图书集合并将它们添加到List

代码语言:javascript
复制
List<Book> library = new ArrayList<>();
library.add(new Book("Great Expectations", false));
library.add(new Book("Moby Dick", false));
library.add(new Book("Catch-22", false));
library.add(new Book("The Great Gatsby", false));

现在,如果我想将Catch-22标记为签出,我所需要做的就是遍历列表,找到我要查找的书,并更改其签出状态:

代码语言:javascript
复制
for(Book book : library) {
  if("Catch-22".equals(book.getTitle()) {
    book.setCheckedOut(true);
    break; // found the book, break out of the loop
  }
}

如果我现在打印出library的内容,我将看到只有Catch-22被标记为被签出:

代码语言:javascript
复制
System.out.println(library);

// prints:
// [Great Expectations: IN, Moby Dick: IN, Catch-22: OUT, The Great Gatsby: IN]

您的实现是使用静态方法。静态方法并不设置特定实例的值,而是在所有实例之间共享的值。

因此,就book类而言,静态方法不是为特定书籍设置属性,而是为所有书籍设置属性。这就是为什么当你试图将一本书设置为被结帐时,它会更新所有的书。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34190146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档