题目:设计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;//将键盘录入的日期字符串转换为DateSimpleDateFormat 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按照出版日期降序排序;然后输出booksArrays.sort(books, new BookComparatorByPubDate());for(Book book:books){System.out.println(book);}//3.将books按照价格升序排序,如果价格相同,则按照书名字母顺序排列。然后输出booksArrays.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;}@Overridepublic String toString() {return "书名:" + name + ",定价:" + price;}}
其中根据输出样例,我们可以得到toString()怎么写的。
toString()方法重写了Object类的toString()方法,以便于打印Book对象时能够输出书名和定价的格式化字符串。
难点就在于,BookComparatorByPubDate(下面简写为1)类和BookComparatorByPrice(2)类中的比较字符串大小。
class BookComparatorByPubDate implements Comparator{@Overridepublic int compare(Object o1, Object o2) {Book b1 = (Book) o1;Book b2 = (Book) o2;return b2.getPublishDate().compareTo(b1.getPublishDate());}}class BookComparatorByPrice implements Comparator{@Overridepublic 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;}@Overridepublic String toString() {return "书名:" + name + ",定价:" + price;}}class BookComparatorByPubDate implements Comparator{@Overridepublic int compare(Object o1, Object o2) {Book b1 = (Book) o1;Book b2 = (Book) o2;return b2.getPublishDate().compareTo(b1.getPublishDate());}}class BookComparatorByPrice implements Comparator{@Overridepublic 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方法。