Trying to create a Library in Java 8 using the Date API. BookCopy has an associa
ID: 3798741 • Letter: T
Question
Trying to create a Library in Java 8 using the Date API.
BookCopy has an associated DueDate (which is null if the book is not checked out)
and LibraryCard has a non-negative balance, which is incurred if books are checked in past their due dates. The library charges $.10 per day per book.
Modify your checkOut method ( which I named removeBookCopy() ) to give the BookCopy a due date that is equal to three weeks from the day that the books are checked out.
Modify your checkIn method ( which I named addBookCopy() )to check if the book is overdue; if so, update the balance accordingly.
Note: although a real library application would use only the real date, for ease of testing and debugging, ALSO create an additional checkIn and checkOut method that takes a date as a parameter, so that you don't have to wait three weeks to test your code.
Also create the following LibraryCard methods:
- a renewal method which allows the cardholder to get a new due date for that book. Renewal periods are in two-week increments.
- a method which takes a date as a parameter and returns a list of books that are due on or before that date.
- a method that checks if any books are overdue. (Note: although in a real-world application, this would check for overdue books using today's date, ALSO create an additional method that takes a date as a parameter for ease of testing.)
- a method that returns a list of all the books checked out, sorted by due date. (You may use an array or an ArrayList -- we're not focusing on the specific data structures yet.)
This is my code so far.
//Book class stores the title, author and ISBN of the book
public class Book {
private String Title;
private String Author;
//Using String for ISBN instead of a int because it is 13 digits long
private String Isbn;
//Constructor
public Book(String title, String author, String isbn)
{
Title = title;
Author = author;
Isbn = isbn;
}
//No need for setters because a book's title, author and ISBN will never change
//Getters
public String getTitle()
{
return Title;
}
public String getAuthor()
{
return Author;
}
public String getIsbn()
{
return Isbn;
}
}
********************************************************************************
//BookCopy class stores the current copy of the book that is being checked in or out and the current library card that is being used.
public class BookCopy {
private Book Book;
private LibraryCard LibraryCard;
//Constructor
//If book is not checked out, pass null for library card
public BookCopy(Book book, LibraryCard libraryCard)
{
Book = book;
LibraryCard = libraryCard;
}
//Getters and setters
public Book getBook()
{
return Book;
}
public LibraryCard getLibraryCard()
{
return LibraryCard;
}
//We don't need setter for Book as a book's copy won't change
//But we need setter for LibraryCard, as multiple people can borrow
//a single book copy
public void setLibraryCard(LibraryCard libraryCard)
{
LibraryCard = libraryCard;
}
}
**********************************************************************
//LibraryCard class stores the library card holder's ID, name and a list of the books that are currently checked out on the card
//Prints the user and checkout information onto the console
import java.util.*;
public class LibraryCard {
private int ID;
private String CardHolderName;
//List that stores the books that are checked out on the card
private ArrayList<BookCopy> BookCopyList = new ArrayList<>();
//Constructor
public LibraryCard(int id, String cardHolderName, BookCopy bookCopy)
{
ID = id;
CardHolderName = cardHolderName;
BookCopyList.add(bookCopy);
}
//Getters and Setters
//We don't need setter for id as it wont change
public int getId()
{
return ID;
}
public String getCardHolderName()
{
return CardHolderName;
}
public void setCardHolderName(String cardHolderName)
{
CardHolderName = cardHolderName;
}
//Methods to Add and remove bookcopies to LibraryCard
public void addBookCopy(BookCopy bookCopy)
{
BookCopyList.add(bookCopy);
//Adding libraryCard to bookcopy
bookCopy.setLibraryCard(this);
//Printing on screen that the book has been checked out
System.out.println("CheckOut Information: ");
System.out.println("Borrower Name: "+this.CardHolderName);
System.out.println("Book Title: "+bookCopy.getBook().getTitle());
System.out.println("Author Name: "+bookCopy.getBook().getAuthor());
System.out.println("ISBN No.: "+bookCopy.getBook().getIsbn());
System.out.println("");
}
//Method returns true if bookCopy was successfully removed from LibraryCard
public boolean removeBookCopy(BookCopy bookCopy)
{
if(BookCopyList.contains(bookCopy))
{
BookCopyList.remove(bookCopy);
//resetting librarycard to null as its checked in now
bookCopy.setLibraryCard(null);
System.out.println("Book Checkd In Successfully:");
System.out.println("Book Title: "+bookCopy.getBook().getTitle());
System.out.println("");
return true;
}
System.out.println("This book is not borrowed by "+this.CardHolderName);
System.out.println("");
return false;
}
}
*******************************************************************************************
//Test program for the Book class, Library class and BookCopy class
public class Main {
public static void main (String[] args) throws java.lang.Exception
{
//List of Books and their bookCopies
Book Book1 = new Book("Diary of a Wimpy Kid # 11: Double Down", "Jeff Kinney", "9781419723445");
BookCopy BookCopy1a = new BookCopy(Book1, null);
BookCopy BookCopy1b = new BookCopy(Book1, null);
Book Book2 = new Book("A Man Called Ove: A Novel", "Fredrik Backman", "9781476738024");
BookCopy BookCopy2a = new BookCopy(Book2, null);
BookCopy BookCopy2b = new BookCopy(Book2, null);
Book Book3 = new Book("To Kill a Mockingbird", "Harper Lee", "9780446310789");
BookCopy BookCopy3a = new BookCopy(Book3, null);
BookCopy BookCopy3b = new BookCopy(Book3, null);
Book Book4 = new Book("A Dance with Dragons", "George R. R. Martin", "9780553801477");
BookCopy BookCopy4a = new BookCopy(Book4, null);
BookCopy BookCopy4b = new BookCopy(Book4, null);
Book Book5 = new Book("One Flew Over the Cuckoo's Nest", "Ken Kesey", "9780451163967");
BookCopy BookCopy5a = new BookCopy(Book5, null);
BookCopy BookCopy5b = new BookCopy(Book5, null);
Book Book6 = new Book("The Amber Spyglass: His Dark Materials", "Philip Pullman", "9780440418566");
BookCopy BookCopy6a = new BookCopy(Book6, null);
BookCopy BookCopy6b = new BookCopy(Book6, null);
Book Book7 = new Book("The Help", "Kathryn Stockett", "9780399155345");
BookCopy BookCopy7a = new BookCopy(Book7, null);
BookCopy BookCopy7b = new BookCopy(Book7, null);
Book Book8 = new Book("Of Mice and Men", "John Steinbeck", "9780140177398");
BookCopy BookCopy8a = new BookCopy(Book8, null);
BookCopy BookCopy8b = new BookCopy(Book8, null);
Book Book9 = new Book("Harry Potter and the Deathly Hallows", "J. K. Rowling", "9780545010221");
BookCopy BookCopy9a = new BookCopy(Book9, null);
BookCopy BookCopy9b = new BookCopy(Book9, null);
Book Book10 = new Book("A Thousand Splendid Suns", "Khaled Hosseini", "9781594489501");
BookCopy BookCopy10a = new BookCopy(Book10, null);
BookCopy BookCopy10b = new BookCopy(Book10, null);
//Library Cards
LibraryCard libraryCard1 = new LibraryCard(1, "Tony Stark", null);
LibraryCard libraryCard2 = new LibraryCard(2, "Bruce Wayne", null);
LibraryCard libraryCard3 = new LibraryCard(3, "Jon Snow", null);
libraryCard1.addBookCopy(BookCopy6a);
libraryCard1.addBookCopy(BookCopy6b);
libraryCard1.addBookCopy(BookCopy5a);
libraryCard2.addBookCopy(BookCopy3b);
libraryCard3.addBookCopy(BookCopy4a);
//This book has been borrowed by libraryCard1Holder
libraryCard1.removeBookCopy(BookCopy6a);
//This book hasn't been borrowed by libraryCard3Holder
libraryCard3.removeBookCopy(BookCopy9b);
}
}
********************************************************************************
Output:
CheckOut Information:
Borrower Name: Tony Stark
Book Title: The Amber Spyglass: His Dark Materials
Author Name: Philip Pullman
ISBN No.: 9780440418566
CheckOut Information:
Borrower Name: Tony Stark
Book Title: The Amber Spyglass: His Dark Materials
Author Name: Philip Pullman
ISBN No.: 9780440418566
CheckOut Information:
Borrower Name: Tony Stark
Book Title: One Flew Over the Cuckoo's Nest
Author Name: Ken Kesey
ISBN No.: 9780451163967
CheckOut Information:
Borrower Name: Bruce Wayne
Book Title: To Kill a Mockingbird
Author Name: Harper Lee
ISBN No.: 9780446310789
CheckOut Information:
Borrower Name: Jon Snow
Book Title: A Dance with Dragons
Author Name: George R. R. Martin
ISBN No.: 9780553801477
Book Checkd In Successfully:
Book Title: The Amber Spyglass: His Dark Materials
This book is not borrowed by Jon Snow
Explanation / Answer
I have kept book class as it is as per your question.
BookCopy.java
import java.time.LocalDate;
//BookCopy class stores the current copy of the book that is being checked in or out and the current library card that is being used.
public class BookCopy {
private Book Book;
private LibraryCard LibraryCard;
// adding dueDate field
private LocalDate dueDate;
// Constructor
// If book is not checked out, pass null for library card
public BookCopy(Book book, LibraryCard libraryCard) {
Book = book;
LibraryCard = libraryCard;
dueDate = null;
}
// Getters and setters
public Book getBook() {
return Book;
}
public LibraryCard getLibraryCard() {
return LibraryCard;
}
public LocalDate getDueDate() {
return dueDate;
}
public void setDueDate(LocalDate dueDate) {
this.dueDate = dueDate;
}
// We don't need setter for Book as a book's copy won't change
// But we need setter for LibraryCard, as multiple people can borrow
// a single book copy
public void setLibraryCard(LibraryCard libraryCard) {
LibraryCard = libraryCard;
}
}
LibraryCard.java
//LibraryCard class stores the library card holder's ID, name and a list of the books that are currently checked out on the card
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
//Prints the user and checkout information onto the console
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class LibraryCard {
private int ID;
private String CardHolderName;
// adding balance field
private double balance;
// List that stores the books that are checked out on the card
private ArrayList<BookCopy> BookCopyList = new ArrayList<>();
// Constructor
public LibraryCard(int id, String cardHolderName, BookCopy bookCopy,
double balance) {
ID = id;
CardHolderName = cardHolderName;
BookCopyList.add(bookCopy);
this.balance = balance;
}
// Getters and Setters
// We don't need setter for id as it wont change
public int getId() {
return ID;
}
public String getCardHolderName() {
return CardHolderName;
}
public void setCardHolderName(String cardHolderName) {
CardHolderName = cardHolderName;
}
// only getter, as the setter for now is through constructor only
public double getBalance() {
return balance;
}
// Methods to Add and remove bookcopies to LibraryCard
public void addBookCopy(BookCopy bookCopy) {
addBookCopy(bookCopy, LocalDate.now());
}
// Methods to Add and remove bookcopies to LibraryCard
// dummy method to test with checkout date
public void addBookCopy(BookCopy bookCopy, LocalDate checkoutDate) {
BookCopyList.add(bookCopy);
// Adding libraryCard to bookcopy
bookCopy.setLibraryCard(this);
// set due date for 3 weeks later
bookCopy.setDueDate(checkoutDate.plusDays(7 * 3));
// Printing on screen that the book has been checked out
System.out.println("CheckOut Information: ");
System.out.println("Borrower Name: " + this.CardHolderName);
System.out.println("Book Title: " + bookCopy.getBook().getTitle());
System.out.println("Author Name: " + bookCopy.getBook().getAuthor());
System.out.println("ISBN No.: " + bookCopy.getBook().getIsbn());
System.out.println("Due date: " + bookCopy.getDueDate());
System.out.println("");
}
// Method returns true if bookCopy was successfully removed from LibraryCard
public boolean removeBookCopy(BookCopy bookCopy) {
return removeBookCopy(bookCopy, LocalDate.now());
}
// Method returns true if bookCopy was successfully removed from LibraryCard
// created for testing with a custom returing date
public boolean removeBookCopy(BookCopy bookCopy, LocalDate returningDate) {
if (BookCopyList.contains(bookCopy)) {
BookCopyList.remove(bookCopy);
// checking if due date is of later time, and we need to subtract
// balance
if (bookCopy.getDueDate().isBefore(returningDate)) {
long noOfDays = ChronoUnit.DAYS.between(bookCopy.getDueDate(), returningDate);
System.out.println("Deduting balance for " + noOfDays
+ " Days.");
balance -= noOfDays * 0.10;
}
// resetting librarycard to null as its checked in now
bookCopy.setLibraryCard(null);
// resetting the due date
bookCopy.setDueDate(null);
System.out.println("Book Checkd In Successfully:");
System.out.println("Book Title: " + bookCopy.getBook().getTitle());
System.out.println("Balance: " + balance);
System.out.println("");
return true;
}
System.out.println("This book is not borrowed by "
+ this.CardHolderName);
System.out.println("");
return false;
}
// renews books due date for 2 weeks more.
public void renewal(BookCopy bookCopy) {
bookCopy.setDueDate(bookCopy.getDueDate().plusDays(14));
System.out.println("Renewal successful.");
// Printing on screen that the book has been checked out
System.out.println("Borrower Name: " + this.CardHolderName);
System.out.println("Book Title: " + bookCopy.getBook().getTitle());
System.out.println("Due date: " + bookCopy.getDueDate());
System.out.println("");
}
// get the books which are overdue on a particular date
public void getListOfBooksDue(LocalDate date) {
ArrayList<BookCopy> dueBooks = new ArrayList<>();
for (BookCopy b : BookCopyList) {
if (!b.getDueDate().isAfter(date)) {
dueBooks.add(b);
System.out.println("Book Title: " + b.getBook().getTitle());
}
}
// return dueBooks; You can get the books if you want.
}
// return the books overdue on the calling date
public void getOverdueBooks() {
getListOfBooksDue(LocalDate.now());
}
// for testing the above method
public void getOverdueBooks(LocalDate d) {
getListOfBooksDue(d);
}
// for testing the above method
public void getCheckedOutBooks() {
ArrayList<BookCopy> resultantList = new ArrayList<>(BookCopyList);
Collections.sort(resultantList, new Comparator<BookCopy>() {
public int compare(BookCopy b1, BookCopy b2) {
return b1.getDueDate().compareTo(b2.getDueDate());
}
});
for (BookCopy b : resultantList) {
System.out.println("Book Title: " + b.getBook().getTitle());
}
// return resultantList;
}
}
Main.java
import java.time.LocalDate;
//Test program for the Book class, Library class and BookCopy class
public class Main {
public static void main (String[] args) throws java.lang.Exception
{
//List of Books and their bookCopies
Book Book1 = new Book("Diary of a Wimpy Kid # 11: Double Down", "Jeff Kinney", "9781419723445");
BookCopy BookCopy1a = new BookCopy(Book1, null);
BookCopy BookCopy1b = new BookCopy(Book1, null);
Book Book2 = new Book("A Man Called Ove: A Novel", "Fredrik Backman", "9781476738024");
BookCopy BookCopy2a = new BookCopy(Book2, null);
BookCopy BookCopy2b = new BookCopy(Book2, null);
Book Book3 = new Book("To Kill a Mockingbird", "Harper Lee", "9780446310789");
BookCopy BookCopy3a = new BookCopy(Book3, null);
BookCopy BookCopy3b = new BookCopy(Book3, null);
Book Book4 = new Book("A Dance with Dragons", "George R. R. Martin", "9780553801477");
BookCopy BookCopy4a = new BookCopy(Book4, null);
BookCopy BookCopy4b = new BookCopy(Book4, null);
Book Book5 = new Book("One Flew Over the Cuckoo's Nest", "Ken Kesey", "9780451163967");
BookCopy BookCopy5a = new BookCopy(Book5, null);
BookCopy BookCopy5b = new BookCopy(Book5, null);
Book Book6 = new Book("The Amber Spyglass: His Dark Materials", "Philip Pullman", "9780440418566");
BookCopy BookCopy6a = new BookCopy(Book6, null);
BookCopy BookCopy6b = new BookCopy(Book6, null);
Book Book7 = new Book("The Help", "Kathryn Stockett", "9780399155345");
BookCopy BookCopy7a = new BookCopy(Book7, null);
BookCopy BookCopy7b = new BookCopy(Book7, null);
Book Book8 = new Book("Of Mice and Men", "John Steinbeck", "9780140177398");
BookCopy BookCopy8a = new BookCopy(Book8, null);
BookCopy BookCopy8b = new BookCopy(Book8, null);
Book Book9 = new Book("Harry Potter and the Deathly Hallows", "J. K. Rowling", "9780545010221");
BookCopy BookCopy9a = new BookCopy(Book9, null);
BookCopy BookCopy9b = new BookCopy(Book9, null);
Book Book10 = new Book("A Thousand Splendid Suns", "Khaled Hosseini", "9781594489501");
BookCopy BookCopy10a = new BookCopy(Book10, null);
BookCopy BookCopy10b = new BookCopy(Book10, null);
//Library Cards
LibraryCard libraryCard1 = new LibraryCard(1, "Tony Stark", null, 10);
LibraryCard libraryCard2 = new LibraryCard(2, "Bruce Wayne", null, 20);
LibraryCard libraryCard3 = new LibraryCard(3, "Jon Snow", null, 15);
// setting due dates for book 6a and 6b
libraryCard1.addBookCopy(BookCopy6a, LocalDate.of(2017, 1, 10));
libraryCard1.addBookCopy(BookCopy6b, LocalDate.of(2017, 1, 10));
libraryCard1.addBookCopy(BookCopy5a);
libraryCard2.addBookCopy(BookCopy3b);
libraryCard3.addBookCopy(BookCopy4a);
// renew due date of book 6b
libraryCard1.renewal(BookCopy6b);
//This book has been borrowed by libraryCard1Holder.. It is being
// returned after due date. So watch the balance being deducted.
libraryCard1.removeBookCopy(BookCopy6a);
//This book hasn't been borrowed by libraryCard3Holder
libraryCard3.removeBookCopy(BookCopy9b);
}
}
Sample Output:
CheckOut Information:
Borrower Name: Tony Stark
Book Title: The Amber Spyglass: His Dark Materials
Author Name: Philip Pullman
ISBN No.: 9780440418566
Due date: 2017-01-31
CheckOut Information:
Borrower Name: Tony Stark
Book Title: The Amber Spyglass: His Dark Materials
Author Name: Philip Pullman
ISBN No.: 9780440418566
Due date: 2017-01-31
CheckOut Information:
Borrower Name: Tony Stark
Book Title: One Flew Over the Cuckoo's Nest
Author Name: Ken Kesey
ISBN No.: 9780451163967
Due date: 2017-03-20
CheckOut Information:
Borrower Name: Bruce Wayne
Book Title: To Kill a Mockingbird
Author Name: Harper Lee
ISBN No.: 9780446310789
Due date: 2017-03-20
CheckOut Information:
Borrower Name: Jon Snow
Book Title: A Dance with Dragons
Author Name: George R. R. Martin
ISBN No.: 9780553801477
Due date: 2017-03-20
Renewal successful.
Borrower Name: Tony Stark
Book Title: The Amber Spyglass: His Dark Materials
Due date: 2017-02-14
Deduting balance for 27 Days.
Book Checkd In Successfully:
Book Title: The Amber Spyglass: His Dark Materials
Balance: 7.3
This book is not borrowed by Jon Snow