I am new to Java and I am trying to create a library program containing two separate class files. One file contains the Book class while the other contains the Library class.
Book class:
public class Book {
private boolean borrowed;
private static String title;
// Creates a new Book
public Book(String title) { // Implement this method
// Marks the book as rented
Book.title = title;
borrowed = false;
}
public void borrowed() { // Implement this method }
// Marks the book as not rented
borrowed = true;
}
public void returned() { // Implement this method }
borrowed = false;
}
public boolean isBorrowed() {
return borrowed; // Implement this method }
// Returns the title of the book public
}
public static String getTitle() { // Implement this method
return title;
}
}
Library class:
import java.util.ArrayList;
import package.Book;
public class Library {
private String hours;
private String address;
private String title;
private Book book;
private ArrayList<Book> books = new ArrayList<Book>();
// Add the missing implementation (methods and data definitions) to this class
// Constructor – look it up
public Library(String address) {
this.address = address;
hours = "9 am to 5 pm";
}
void printOpeningHours()
{
System.out.println(hours);
}
void printAddress() {
System.out.println(address);
}
void addBook(Book book)
{
this.book = book;
books.add(book);
}
void printAvailableBooks() {
if (books.size() == 0){
System.out.println("There are no books available");
}
else {
System.out.println(books);
}
}
void borrowBook(String title)
{
this.title = title;
for (int i = 0; i < books.size(); i ) {
if ((books.get(i).getTitle()) == title) {
if (book.isBorrowed() == false){
book.borrowed();
}
else {
System.out.println("Sorry, that book is already checked out");
}
}
else {
System.out.println("Sorry, no such book is available");
}
}
}
void returnBook(String title) {
for (int i = 0; i < books.size(); i ) {
if (book.getTitle() == title) {
if (book.isBorrowed() == true){
book.returned();
}
}
}
}
public static void main(String[] args) {
// Create two libraries
Library firstLibrary = new Library("10 Main St.");
Library secondLibrary = new Library("228 Liberty St.");
// Add four books to the first library
firstLibrary.addBook(new Book("The Da Vinci Code")); firstLibrary.addBook(new Book("Le Petit Prince"));
firstLibrary.addBook(new Book("A Tale of Two Cities")); firstLibrary.addBook(new Book("The Lord of the Rings"));
// Print opening hours and the addresses
System.out.println("Library hours:");
firstLibrary.printOpeningHours();
System.out.println("Library addresses:");
firstLibrary.printAddress();
System.out.println();
System.out.println("Library hours:");
secondLibrary.printOpeningHours();
System.out.println("Library addresses:");
secondLibrary.printAddress();
// Try to borrow The Lords of the Rings from both libraries System.out.println("Borrowing The Lord of the Rings:"); firstLibrary.borrowBook("The Lord of the Rings");
firstLibrary.borrowBook("The Lord of the Rings"); secondLibrary.borrowBook("The Lord of the Rings");
System.out.println();
// Print the titles of all available books from both libraries System.out.println("Books available in the first library:"); firstLibrary.printAvailableBooks();
System.out.println();
System.out.println("Books available in the second library:"); secondLibrary.printAvailableBooks();
System.out.println();
// Return The Lords of the Rings to the first library
System.out.println("Returning The Lord of the Rings:"); firstLibrary.returnBook("The Lord of the Rings");
System.out.println();
}
}
However, my issue is that when I try to add a book in the books array via the addBook(book) method, it doesn't do so, and as a result, it prints out "Sorry, that book is already checked out."
Here is the result for clarification:
Library hours:
9 am to 5 pm
Library addresses:
10 Main St.
Library hours:
9 am to 5 pm
Library addresses:
228 Liberty St.
Sorry, that book is already checked out
Sorry, that book is already checked out
Sorry, that book is already checked out
Books available in the second library:
There are no books available
Returning The Lord of the Rings:
What should I do so that the arraylist will recognize the book objects implemented?
CodePudding user response:
Your borrowBook
method is all over the place.
It should be something along the lines of
void borrowBook(String title) {
for (Book book : books) {
if (book.getTitle().equals(title)) {
if (!book.isBorrowed()) {
book.borrowed();
} else {
System.out.println("Sorry, that book is already checked out");
}
return;
}
}
System.out.println("Sorry, no such book is available");
}
That
- removes the
title
assignment - simplifies the boolean logic
- properly compares strings
- properly returns early
- only prints the error message at the very end
- removes usage of the
book
field (which combined with thetitle
screwed everything up) - utilizes a for-each instead of a regular for
- don't make the
Book
'stitle
orgetTitle
static
.
Additionally remove the title
and book
fields from the Library
entirely, they should not be there ever.
And then finally note that the second library really has no books added to it.
You should implement the returnBook
in a similar fashion, it has a similar string comparison flaw.
CodePudding user response:
The check
if ((books.get(i).getTitle()) == title) {
Is an equally by reference, which always evaluated to *false * in your case. Change it as:
if ((books.get(i).getTitle()).equals(title)) {
CodePudding user response:
I edited some part of your code. I split into two seperate file your Library.java. The first is Library.java, second is Application.java.
Your Book.java:
public class Book {
private boolean borrowed;
private String title;
// Creates a new Book
public Book(String title) { // Implement this method
// Marks the book as rented
this.title = title;
this.borrowed = false;
}
public void borrowed() { // Implement this method }
// Marks the book as not rented
this.borrowed = true;
}
public void returned() { // Implement this method }
this.borrowed = false;
}
public boolean isBorrowed() {
// Returns the title of the book public
return this.borrowed; // Implement this method }
}
public String getTitle() { // Implement this method
return this.title;
}
@Override
public String toString(){
return "title: " this.title ", borrowed: " this.borrowed;
}
}
Your Library.java:
import java.util.ArrayList;
public class Library {
private String hours;
private String address;
private ArrayList<Book> books = new ArrayList<Book>();
// Add the missing implementation (methods and data definitions) to this class
// Constructor – look it up
public Library(String address) {
this.address = address;
hours = "9 am to 5 pm";
}
void printOpeningHours() {
System.out.println(hours);
}
void printAddress() {
System.out.println(address);
}
void addBook(Book book) {
books.add(book);
System.out.println("Added book " book.getTitle());
}
void printAvailableBooks() {
if (books.size() == 0) {
System.out.println("There are no books available");
} else {
System.out.println(books);
}
}
void borrowBook(String title) {
System.out.println("Borrowing the " title);
int foundIndex = Integer.MIN_VALUE;
for (int i = 0; i < books.size(); i ) {
if (books.get(i).getTitle().equals(title)) {
foundIndex = i;
break;
}
}
if (foundIndex >= 0) {
if (!books.get(foundIndex).isBorrowed()) {
books.get(foundIndex).borrowed();
System.out.println("Book borrowed.");
} else {
System.out.println("Sorry, that book is already checked out");
}
} else {
System.out.println("Sorry, no such book is available!");
}
}
void returnBook(String title) {
int foundIndex = Integer.MIN_VALUE;
System.out.println("Returning the book " title);
for (int i = 0; i < books.size(); i ) {
if (books.get(i).getTitle().equals(title)) {
foundIndex = i;
}
}
if (foundIndex >= 0) {
if (books.get(foundIndex).isBorrowed()) {
books.get(foundIndex).returned();
System.out.println("Book returned.");
} else {
System.out.println("Book didn't borrowed.");
}
} else {
System.out.println("Sorry, no such book is available!");
}
}
}
Application.java:
public class Application {
public static void main(String[] args) {
// Create two libraries
Library firstLibrary = new Library("10 Main St.");
Library secondLibrary = new Library("228 Liberty St.");
// Add four books to the first library
firstLibrary.addBook(new Book("The Da Vinci Code"));
firstLibrary.addBook(new Book("Le Petit Prince"));
firstLibrary.addBook(new Book("A Tale of Two Cities"));
firstLibrary.addBook(new Book("The Lord of the Rings"));
// Print opening hours and the addresses
System.out.println("Library hours:");
firstLibrary.printOpeningHours();
System.out.println("Library addresses:");
firstLibrary.printAddress();
System.out.println();
firstLibrary.printAvailableBooks();
System.out.println("Library hours:");
secondLibrary.printOpeningHours();
System.out.println("Library addresses:");
secondLibrary.printAddress();
// Try to borrow The Lords of the Rings from both libraries System.out.println("Borrowing The Lord of the Rings:"); firstLibrary.borrowBook("The Lord of the Rings");
firstLibrary.borrowBook("The Lord of the Rings");
secondLibrary.borrowBook("The Lord of the Rings");
System.out.println();
// Print the titles of all available books from both libraries System.out.println("Books available in the first library:"); firstLibrary.printAvailableBooks();
System.out.println();
System.out.println("Books available in the second library:");
secondLibrary.printAvailableBooks();
System.out.println();
// Return The Lords of the Rings to the first library
// System.out.println("Returning The Lord of the Rings:");
firstLibrary.returnBook("The Lord of the Rings");
System.out.println();
}
}
Some advices about design of your code:
- You shouldn't make static your object's properties.
- You should override toString method of a class that you want to print with println.
- If you search in an array, you should get the founded index first and then you should do what you want.
- You should use equals method of a string object to compare content. == compares object's itself (reference) with another object, not content.
- Book object in the Library class is unnecessary. You already keep your books list in an ArrayList.