Java基础编程练习第35题-可实现多种排序的Book类(PTA练习题)
题目:设计Book类,要求:
裁判测试程序样例:
public class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); Book[] books = new Book[4]; //1. 从键盘接收用户输入的4本书的名称(仅有英文字符构成)、出版日期(格式:1998-10-09)、价格,生成Book对象,构造包含4本书的数组 for(int i=0;i<4;i++){ String name = scan.next(); String date_str = scan.next(); Date date = null; //将键盘录入的日期字符串转换为Date SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); try { date = sdf.parse(date_str); } catch (ParseException e) { System.out.println("日期格式有误");; } double price = Double.parseDouble(scan.next()); Book book = new Book(name, date, price); books[i] = book; } //2.将books按照出版日期降序排序;然后输出books Arrays.sort(books, new BookComparatorByPubDate()); for(Book book:books){ System.out.println(book); } //3.将books按照价格升序排序,如果价格相同,则按照书名字母顺序排列。然后输出books Arrays.sort(books, new BookComparatorByPrice()); for(Book book:books){ System.out.println(book); } scan.close(); } } /* 请在这里填写答案 */
输入样例:
Java 2011-08-01 29 Python 2014-01-01 48 C 2004-09-08 17.5 DataBase 2012-09-17 17.5
输出样例:
书名:Python,定价:48.0 书名:DataBase,定价:17.5 书名:Java,定价:29.0 书名:C,定价:17.5 书名:C,定价:17.5 书名:DataBase,定价:17.5 书名:Java,定价:29.0 书名:Python,定价:48.0
解析:
根据要求1),我们可以给出Book类
class Book{ private String name; private Date publishDate; private double price; public Book(String name, Date publishDate, double price) { this.name = name; this.publishDate = publishDate; this.price = price; } public String getName() { return name; } public Date getPublishDate() { return publishDate; } public double getPrice() { return price; } @Override public String toString() { return "书名:" + name + ",定价:" + price; } }
其中根据输出样例,我们可以得到toString()怎么写的。
toString()方法重写了Object类的toString()方法,以便于打印Book对象时能够输出书名和定价的格式化字符串。
难点就在于,BookComparatorByPubDate(下面简写为1)类和BookComparatorByPrice(2)类中的比较字符串大小。
class BookComparatorByPubDate implements Comparator{ @Override public int compare(Object o1, Object o2) { Book b1 = (Book) o1; Book b2 = (Book) o2; return b2.getPublishDate().compareTo(b1.getPublishDate()); } } class BookComparatorByPrice implements Comparator{ @Override public int compare(Object o1, Object o2) { Book b1 = (Book) o1; Book b2 = (Book) o2; if(b1.getPrice() == b2.getPrice()) { return b1.getName().compareTo(b2.getName()); } else { return b1.getPrice() < b2.getPrice() ? -1 : 1; } } }
以下详细讲解下1类(2类与1类类似):
1类实现了Comparetor接口,用于比较两个Book对象的出版日期。
compare(Object o1,Object o2)方法接受了两个Object类型的参数,它们将被转换为Book类型。
方法内部比较两个Book对象的publishDate。它使用Date类的compareTo方法来比较日期,如果第一个日期在第二个日期之后,则返回正值;如果第一个日期在第二个日期之前,则返回负值;如果相同,则返回0。
代码如下:
class Book{ private String name; private Date publishDate; private double price; public Book(String name, Date publishDate, double price) { this.name = name; this.publishDate = publishDate; this.price = price; } public String getName() { return name; } public Date getPublishDate() { return publishDate; } public double getPrice() { return price; } @Override public String toString() { return "书名:" + name + ",定价:" + price; } } class BookComparatorByPubDate implements Comparator{ @Override public int compare(Object o1, Object o2) { Book b1 = (Book) o1; Book b2 = (Book) o2; return b2.getPublishDate().compareTo(b1.getPublishDate()); } } class BookComparatorByPrice implements Comparator{ @Override public int compare(Object o1, Object o2) { Book b1 = (Book) o1; Book b2 = (Book) o2; if(b1.getPrice() == b2.getPrice()) { return b1.getName().compareTo(b2.getName()); } else { return b1.getPrice() < b2.getPrice() ? -1 : 1; } } }
其中:
Book b1 = (Book) o1; Book b2 = (Book) o2;
(Book)o1 和 (Book) o2是类型转换操作,它们将o1和o2两个参数转换为Book类型。
在Java中,compare方法用于比较两个对象,以确定它们的顺序。这个方法在Comparetor中定义,用于实现自定义的比较逻辑。
举个例子:
public interface Comparator<T> { int compare(T o1, T o2); }
Comparator接口定义了一个compare方法。