我被赋予使用带有lambda表达式的构造函数TreeSet(Comparator<E> comparator
)来使集合按书名排序的任务。
给出以下信息:
public class Book implements Comparable<Book> {
private String isbn;
private String title;
private String author;
public Book(String isbn, String title, String author) {
this.isbn = isbn;
this.title = title;
this.author = author;
}
public int compareTo(Book obj) {
return isbn.compareTo(obj.isbn);
}
public String getTitle() {
return title;
}
到目前为止,我想到的是:我认为构造函数允许您定义比较器。也许我应该这样做:
Comparator<String> comp =
(String title, String obj.title) -> (title.compareTo(obj.title));
然后将这个comp放入TreeSet<Book> bookSet = new TreeSet<Book>(comp);
但是,这似乎不起作用。我认为我需要做的是在创建新的TreeSet时在同一行中使用lambda表达式,但是,我不确定该怎么做。
您需要Comparator<Book>
,而不是Comparator<String>
。最简单的一种方法是使用Comparator.comparing
:
Comparator.comparing
您正在寻找book比较器。即使您要按书名进行比较,您仍然必须使用TreeSet<Book> bookSet = new TreeSet<>(Comparator.comparing(Book::getTitle));
。
要重用您的代码,您需要进行的更正是:
Comparator<Book>
可以改写为
Comparator<Book> comp =
(Book book1, Book book2) -> (book1.getTitle().compareTo(book2.getTitle()));
或
Comparator<Book> comp =
(book1, book2) -> (book1.getTitle().compareTo(book2.getTitle()));
然后您可以将Comparator<Book> comp = Comparator.comparing(Book::getTitle);
作为参数传递给comp
的构造函数