头歌java课程实验(函数式接口及lambda表达式)
第1关:利用lambda表达式对Book数组按多个字段进行排序
任务描述
本关任务:利用Comparator接口完成对Book数组同时按多个字段进行排序。
编程要求
1、本任务共有三个文件,可查看各文件的内容
2、无需修改SortBy.java枚举文件及Book.java类文件的内容
3、修改完善Test.java类文件的内容,共有两处修改要求
(1)根据sort方法参数by的值返回比较器对象,要求利用lambda表达式实现函数式接口Comparator中抽象方法compare的功能,若o1大于、等于、小于o2,分别返回正整数、0、负整数
(2)修改main方法代码,使其可同时根据图书作者、库存数量及单价对Book数组进行排序
运行示例
下面是按要求完成修改后正确的显示结果:
读城记 易中天 10 26.00
品人录 易中天 20 21.80
品三国 易中天 20 50.00
连城诀 金庸 5 18.50
雪山飞狐 金庸 5 19.00
鹿鼎记 金庸 5 96.00
碧血剑 金庸 10 38.00
笑傲江湖 金庸 20 76.00
测试说明
平台会对你编写的代码进行测试~
开始你的任务吧,祝你成功!
Test.java:
import java.util.Arrays;
import java.util.Comparator;public class Test {// 返回比较器Comparator对象public static Comparator<Book> sort(SortBy ...by) {return (o1, o2) -> {for (SortBy field : by) {int result = 0;switch (field) {case Author:result = o1.author.compareTo(o2.author);break;case Price:result = Double.compare(o1.price, o2.price);break;case Number:result = Integer.compare(o1.number, o2.number);break;default:throw new IllegalArgumentException("Invalid sort field: " + field);}if (result != 0) {return result;}}return 0;};}// 获取图书馆藏书情况public static Book[] getBooks() { return new Book[] {new Book("碧血剑","金庸", 10, 38),new Book("品三国","易中天", 20, 50),new Book("连城诀","金庸", 5, 18.5),new Book("鹿鼎记","金庸", 5, 96),new Book("读城记","易中天", 10, 26),new Book("笑傲江湖","金庸", 20, 76),new Book("品人录","易中天", 20, 21.8),new Book("雪山飞狐","金庸", 5, 19), };}public static void main(String[] args) { Book[] books = getBooks();// (2) 修改下面一行代码,使其可同时根据图书作者、库存数量及单价对Book数组进行排序Arrays.sort(books, sort(SortBy.Author, SortBy.Number, SortBy.Price));// 循环显示排序后的结果for (Book book : books) { System.out.println(book);}}
}
SortBy.java:
//本枚举定义无需修改
public enum SortBy { //图书排序的枚举常亮Author, Price, Number //可以按图书作者、单价、库存数量进行排序
}
Book.java:
//本Book类的定义无需修改
public class Book { //图书馆藏书,为简单起见,这里数据都是publicpublic String title; //书名public String author; //作者public int number; //库存数量public double price; //图书单价public Book(String title, String author, int number, double price) {this.title=title;this.author=author;this.number=number;this.price=price;}@Overridepublic String toString() {return String.format("%s\t%s\t%d\t%.2f", title, author, number, price);}
}