brainfrz icon

Untitled

brainfrz | PRO | 10/18/15 12:14:39 PM UTC | 0 ⭐ | 871 👁️ | Never ⏰ | []
Java |

10.09 KB

|

None

|

0 👍

/

0 👎

/**************************************************************************************************
 *  Program Name:     Programming Project 5.7: Bookshelf
 *  Class Name:       pp5_7.Bookshelf
 *  Author:           Terry Weiss
 *  Date Written:     October 15, 2015
 *  Program Description:
 *     This class contains instance data for a bookshelf that is full of `Book`s. It allows the
 *  User to store a book, browse the list of books, view the details of a particular book and
 *  take a book off the shelf.
 **************************************************************************************************/
package pp5_7;
 
//import pp5_7.Book;
import java.util.Scanner;
import java.util.ArrayList;
import java.util.Collections;
 
 
/**
 *
 * @author Terry Weiss
 * @see    pp5_7.Book
 * @see    pp5_7.Librarian
*/
public class Bookshelf {
    private final String DEFAULT_NAME = "Bookshelf";
 
    private ArrayList<Book> bookList = new ArrayList();
    private ArrayList<String> genreList = new ArrayList();
    private ArrayList<String> authorList = new ArrayList();
    private final String name;
 
 
    Bookshelf() {
        name = DEFAULT_NAME;
    }
 
    Bookshelf( String name ) {
        this.name = name;
    }
 
 
    public int getNumberOfBooks() {
        return bookList.size();
    }
 
    public String getName() {
        return name;
    }
 
 
    Book addBook( Book book ) {
        bookList.add(book);
 
        String genre = book.getGenre();
        if (!genreList.contains(genre)) {
            genreList.add(genre);
        }
 
        String author = book.getAuthor();
        if (!authorList.contains(author)) {
            authorList.add(author);
        }
 
        return book;
    }
 
    boolean removeBook( Book book ) {
        // If it's the only book of that genre or author, remove the genre/author from its list
        String genre = book.getGenre();
        if (numBooksWithGenre(genre) == 1) {
            genreList.remove(genre);
        }
 
        String author = book.getAuthor();
        if (numBooksWithAuthor(author) == 1) {
            authorList.remove(author);
        }
 
        return bookList.remove(book);
    }
 
    Book removeBook( int position ) {
        String genre = bookList.get(position).getGenre();
        if (numBooksWithGenre(genre) == 1) {
            genreList.remove(genre);
        }
 
        String author = bookList.get(position).getAuthor();
        if (numBooksWithGenre(genre) == 1) {
            authorList.remove(author);
        }
 
        return bookList.remove(position);
    }
 
    boolean removeBook( String title ) {
        if (numBooksWithTitle(title) == 1) {
            removeBook(findBook(title));
            return true;
        }
        else {
            return false;
        }
    }
 
 
    String viewBook( int position ) {
        String ret;
 
        if (position < 0 || position >= bookList.size()) {
            ret = "That book isn't on the shelf.";
        }
        else {
            ret = bookList.get(position).displayDetails();
        }
 
        return ret;
    }
 
    String viewBook( String title ) {
        String details = "";
 
        for (Book currentBook : bookList) {
            if (currentBook.getTitle().equalsIgnoreCase(title)) {
                if (details.length() > 0) {  // Separate each entry by a blank line in cases
                    details += "\n\n";       // of duplicate titles
                }
 
                details += currentBook.displayDetails();
            }
        }
 
        if (details.length() == 0) {
            details = title + " isn't on the shelf.";
        }
 
        return details;
    }
 
 
    public void sortBooksByTitle() {
        Collections.sort(bookList, Book.sortByTitle);
    }
 
    /**
     * Sort the Books by Author first and then by Title
     */
    public void sortBooksByAuthor() {
        sortBooksByTitle();
        Collections.sort(bookList, Book.sortByAuthor);
    }
 
    /**
     * Sort the Books by Genre first and then by Title
     */
    public void sortBooksByGenre() {
        sortBooksByTitle();
        Collections.sort(bookList, Book.sortByGenre);
    }
 
    /**
     * Sort the Books by size first and then by Title
     */
    public void sortBooksBySize() {
        sortBooksByTitle();
        Collections.sort(bookList);
    }
 
 
    /**
     * Returns the index of the first occurrence of the Book in this list, or -1 if this list
     * does not contain the Book.
     *
     * @param book Book object to search for
     * @return the index of the first Book, or -1 if it's not there
     */
    public int findBook( Book book ) {
        return bookList.indexOf(book);
    }
 
    /**
     * Returns the index of the first occurrence of the Book of the same title in this list,
     * or -1 if this list does not contain the Book.
     *
     * @param title Title of the book to search for
     * @return the index of the first Book, or -1 if it's not there
     */
    public int findBook( String title ) {
        for (int currentBook = 0; currentBook < bookList.size(); currentBook++) {
            String currentTitle = bookList.get(currentBook).getTitle();
            if (currentTitle.equalsIgnoreCase(title)) {
                return currentBook;
            }
        }
 
        return -1;
    }
 
 
    public int numBooksWithGenre( String genre ) {
        int books = 0;
 
        for (Book book : bookList ) {
            if (book.getGenre().equalsIgnoreCase(genre)) {
                books++;
            }
        }
 
        return books;
    }
 
    public int numBooksWithAuthor( String author ) {
        int books = 0;
 
        for (Book book : bookList ) {
            if (book.getAuthor().equalsIgnoreCase(author)) {
                books++;
            }
        }
 
        return books;
    }
 
    public int numBooksWithTitle( String title ) {
        int books = 0;
 
        for (Book book : bookList ) {
            if (book.getTitle().equalsIgnoreCase(title)) {
                books++;
            }
        }
 
        return books;
    }
 
 
    public String browse() {
        String list = "";
 
        for (Book currentBook : bookList ) {
            list += currentBook + "\n";
        }
 
        return list;
    }
 
    public String browseByTitle() {
        sortBooksByTitle();
        return browse();
    }
 
    public String browseByAuthor() {
        sortBooksByAuthor();
        return browse();
    }
 
    public String browseByGenre() {
        sortBooksByGenre();
        return browse();
    }
 
    public String browseBySize() {
        sortBooksBySize();
        return browse();
    }
 
    public String browseBooksOfGenre( String genre ) {
        String list = "";
 
        // Make the genre Capitalized to match format of genres and be case-insensitive
        genre = genre.substring(0, 1).toUpperCase() + genre.substring(1).toLowerCase();
 
        if (genreList.indexOf(genre) == -1) {
            list = "There are no books of that genre.\n";
        }
        else {
            sortBooksByGenre();
            int i = 0;
 
            // Find first book with the genre
            while (!bookList.get(i).getGenre().equalsIgnoreCase(genre)) {
                i++;
            }
 
            // Display all books until the genre changes or until it's the last book of the shelf
            while (i < bookList.size() && bookList.get(i).getGenre().equalsIgnoreCase(genre)) {
                list += bookList.get(i) + "\n";
                i++;
            }
        }
 
        return list;
    }
 
    public String browseBooksOfAuthor( String author ) {
        String list = "";
 
        // Make the genre Capitalized to match format of genres and be case-insensitive
        author = author.substring(0, 1).toUpperCase() + author.substring(1).toLowerCase();
 
        if (authorList.indexOf(author) == -1) {
            list = "There are no books by that author.\n";
        }
        else {
            sortBooksByAuthor();
            int i = 0;
 
            // Find first book with the genre
            while (!bookList.get(i).getAuthor().equalsIgnoreCase(author)) {
                i++;
            }
 
            // Display all books until the genre changes or until it's the last book of the shelf
            while (i < bookList.size() && bookList.get(i).getAuthor().equalsIgnoreCase(author)) {
                list += bookList.get(i) + "\n";
                i++;
            }
        }
 
        return list;
    }
 
    public String browseByCategory( String category ) {
        String list = "";
 
        if (category.equalsIgnoreCase("author")) {
            for (String author : authorList) {
                list += author + ":\n"
                      + browseBooksOfAuthor(author) + "\n";
            }
        }
        else if (category.equalsIgnoreCase("genre")) {
            for (String genre : genreList) {
                list += genre + ":\n"
                      + browseBooksOfGenre(genre) + "\n";
            }
        }
        else {
            list = "No such category.\n";
        }
 
        return list;
    }
 
 
 
    @Override
    public String toString() {
        return getName();
    }
 
 
 
 
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        Scanner user_input = new Scanner(System.in);
 
        Bookshelf myShelf = new Bookshelf();
        myShelf.addBook(new Book("book1", 321, "martin", "fiction"));
        myShelf.addBook(new Book("book2", 123, "Martin", "non-fiction"));
        myShelf.addBook(new Book("book3", 852, "Peter", "sci-fi"));
        myShelf.addBook(new Book("book4", 753, "Martin", "fiction"));
        myShelf.addBook(new Book("book5", 159, "Ralph", "non-fiction"));
        myShelf.addBook(new Book("book6", 349, "MartIn", "fiction"));
 
        myShelf.removeBook("book2");
 
        System.out.print(myShelf.browseByCategory("author"));
 
        System.out.println(myShelf.viewBook("book1"));
    }
}

Comments