我是java的新手,对代码中的不一致/混乱感到非常抱歉。
我正在创建一个简单的图书馆程序,其中一个要求是显示图书馆中的所有书籍及其状态(无论在里面还是向外)。
例如:
远大期望: 风筝追逐者:出局 呼啸山庄:出去
但是,如果我只检查了一本书,它就会将所有的图书状态更改为" out“,而不是其中的一本。举个例子,我一直在想:
远大期望:出局 风筝追逐者:出局 呼啸山庄:出去
在我的图书类中,我有类似的状态设置器/getter,还有一个保存所有库书籍的ArrayList BookList。
static ArrayList <String> BookList = new ArrayList <String> ();
public static String getStatus(String book)
{
return status;
}
public static void setStatus(String newStatus)
{
status = newStatus;
}这是赞助类的借阅书籍的方法。
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!----------");
}
}如何才能使数组列表中只有指定的书籍更改其状态?我试图创建不同的方法,但这似乎也不起作用:
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 :(图书班:
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;
}
}发布于 2015-12-11 00:11:35
对于您的getStatus方法来说,您使用的是一个静态变量,这意味着它在所有图书实例中都是相同的,您不希望这样,只需从Book中的变量和方法中删除所有的静态变量,它就会正常工作。
发布于 2015-12-11 03:08:41
为了建模您的“库”,您需要有图书的实例。将您的Book类看作是定义书籍的蓝图。然后,您需要使用此蓝图来创建实际的Book对象。
保持简单,这里是一个Book类的例子。它定义了一个具有标题和签出状态的图书。
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");
}
}您可以创建这样的特定书籍:
Book greatExpectations = new Book("Great Expectations", false);这就创建了一本名为“远大期望”的新书,而这本书并没有被检出。System.out.println(greatExpectations)会打印Great Expectations: OUT。
因此,为了设置您的“库”,让我们创建一个图书集合并将它们添加到List中
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标记为签出,我所需要做的就是遍历列表,找到我要查找的书,并更改其签出状态:
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被标记为被签出:
System.out.println(library);
// prints:
// [Great Expectations: IN, Moby Dick: IN, Catch-22: OUT, The Great Gatsby: IN]您的实现是使用静态方法。静态方法并不设置特定实例的值,而是在所有实例之间共享的值。
因此,就book类而言,静态方法不是为特定书籍设置属性,而是为所有书籍设置属性。这就是为什么当你试图将一本书设置为被结帐时,它会更新所有的书。
https://stackoverflow.com/questions/34190146
复制相似问题