简体   繁体   中英

How do I sort custom objects alphabetically in an array in Java?

How would I sort my inventory array alphabetically?

This is for a project that I am working on. I tried to use Arrays.sort(inventory); but it did not work.

Could someone please tell me what I am doing wrong?

Book class:

//Filename: BookStore.java
//Description: Purpose is to display what books are in stock and ISBN, title, author name, year, publishers name, and price.
//Author Name: David Finocchi
//Date: 01/19/2014
import java.util.Arrays;
import java.text.DecimalFormat;

class Book {
    protected long isbn;
    protected String title;
    protected String autName;
    protected int year;
    protected String pubName;
    protected double price;
    protected int quantity;


    // Constructor
    public Book(long isbn, String title, String autName, int year, String pubName, double price) {
        setIsbn(isbn);
        setTitle(title);
        setAut(autName);
        setYear(year);
        setPub(pubName);
        setPrice(price);
    }

    // methods for class variables
    public long getIsbn() {
        return isbn;
    }

    public void setIsbn(long isbn) {
        this.isbn = isbn;
    }

    public String getTitle() {
        return title;
    }

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

    public String getAut() {
        return autName;
    }

    public void setAut(String autName) {
        this.autName = autName;
    }

    public int getYear() {
        return year;
    }

    public void setYear(int year) {
        this.year = year;
    }

    public String getPub() {
        return pubName;
    }

    public void setPub(String pubName) {
        this.pubName = pubName;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public int getQuantity() {
        return quantity;
    }

    public void setQuantity(int quantity) {
        this.quantity = quantity;
    }

    public double calTotal() {
        return price;
    }

    //toString for the book array
    public String toString() {
        return "ISBM: " + isbn + "\n" + "Title: " + title + "\n" + "Author's Name: " + autName + "\n" + "Year Published: " + year + "\n" + "Publisher's Name: " + pubName + "\n" + "Price: $" + price + "\n\n";
    }

}// end class Book

EBook class:

class EBook extends Book {

    private String website;

    //constructor and super
    public EBook(long isbn, String title, String autName, int year,
                 String pubName, double price, String website) {
        super(isbn, title, autName, year, pubName, price);
        setWebsite(website);
    }

    // get and set
    public String getWebsite() {
        return website;
    }


    public void setWebsite(String website) {
        this.website = website;
    }

    public double discount() {
        return price * 0.10;
    }

    DecimalFormat money = new DecimalFormat("$0.00");

    //toString for the Book array
    public String toString() {
        return "ISBM: " + isbn + "\n" + "Title: " + title + "\n" + "Author's Name: " + autName + "\n" + "Year Published: " + year + "\n" + "Publisher's Name: " + pubName + "\n" + "Price: " + money.format(price) + "\n" + "Website: " + website + "\n" + "Discount: " + money.format(discount()) + "\n\n";
    }

}//end class EBook

BookStore class (with main method):

public class BookStore {
    //main method
    public static void main(String[] args) {
        // book array
        Book[] inventory = new Book[5];

        EBook a = new EBook(75260012L, "David goes to School", "David Shannon", 2010, "Shannon Rock", 11.98, "http://www.tinyurl.qqwert67o9");
        Book b = new Book(7423540089L, "No David!", "David Shannon", 2009, "Shannon Rock", 12.99);
        Book c = new Book(743200616L, "Simple Abundance", "Sarah Breathnach", 2009, "Scribner", 14.99);
        EBook d = new EBook(78137521819L, "The very hungry caterpillar", "Eric Carle", 2005, "Philomel Books", 13.99, "http://www.tinyurl.fguopt8u90");
        Book e = new Book(9781416987116L, "We're going on a bear hunt", "Michael Rosen", 2009, "McElderry", 15.99);

        inventory[0] = a;
        inventory[1] = b;
        inventory[2] = c;
        inventory[3] = d;
        inventory[4] = e;

        double total = 0.0;

        //print text to user
        System.out.println("Bookstore Items:" + "\n");
        //print array
        for (int i = 0; i < inventory.length; i++) {
            System.out.println(inventory[i]);
            total += inventory[i].getPrice();
        }
        //print total
        DecimalFormat money = new DecimalFormat("$0.00");
        System.out.printf("Total Inventory Value: " + money.format(total));
    }

}// end class BookStore

Arrays.sort() uses the natural ordering of the objects, so that would imply that you need them to implement Comparable , or you're going to get unreliable sorting behavior.

Simply put, if you want to sort each book by its title, then have it implement Comparable :

public class Book implements Comparable<Book> {
    public int compareTo(Book otherBook) {
        return title.compareTo(otherBook.getTitle());
    }
}

You'd also want to do the same for the subclass EBook as well.

You can`t just sort string attribute of a class by directly putting that class to array.sort. If you use the array list rather than array, then you could use the Collection.sort() to sort the list using field inside the book object.

public static void main(String[] args) {

// book array

ArrayList<Book> inventory = new ArrayList<Book>();

inventory.add (new Book(9781416987116L, "We're going on a bear hunt", "Michael Rosen", 2009, "McElderry", 15.99));
inventory.add (new Book(743200616L, "Simple Abundance", "Sarah Breathnach", 2009, "Scribner", 14.99));
inventory.add(new EBook(75260012L, "David goes to School", "David Shannon", 2010, "Shannon Rock", 11.98, "http://www.tinyurl.qqwert67o9"));
inventory.add (new Book(7423540089L, "No David!", "David Shannon", 2009, "Shannon Rock", 12.99));
inventory.add (new EBook(78137521819L, "The very hungry caterpillar", "Eric Carle", 2005, "Philomel Books", 13.99, "http://www.tinyurl.fguopt8u90"));

Collections.sort(inventory, new Comparator<Book>() {
    public int compare(Book result1, Book result2) {
        return result1.getTitle().compareTo(result2.getTitle());
    }
});

for (int i =0;i<inventory.size();i++){
    System.out.println(inventory.get(i).getTitle());
}

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM