第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 { //图书馆藏书,为简单起见,这里数据都是public
public 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;
}
@Override
public String toString() {
return String.format("%s\t%s\t%d\t%.2f", title, author, number, price);
}
}