我如何按字母顺序对inventory
数组进行排序?
这是我正在进行的项目。我尝试使用Arrays.sort(inventory);
但它没有用。
有人可以告诉我我做错了吗?
图书课程:
//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
电子书课程:
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类(使用main方法):
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
答案 0 :(得分:4)
Arrays.sort()使用对象的自然排序,这意味着您需要它们来实现Comparable
,否则您将获得不可靠的排序行为。
简单地说,如果你想按照标题对每本书进行排序,那么让它实现Comparable
:
public class Book implements Comparable<Book> {
public int compareTo(Book otherBook) {
return title.compareTo(otherBook.getTitle());
}
}
您也希望对子类EBook
也这样做。
答案 1 :(得分:0)
您不能直接将该类放到array.sort中来对类的字符串属性进行排序。 如果使用数组列表而不是数组,则可以使用Collection.sort()使用book对象中的字段对列表进行排序。
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());
}
}