将构造函数与Lambda表达式配合使用(Set Comparator)

问题描述 投票:0回答:1

我被赋予使用带有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表达式,但是,我不确定该怎么做。

java lambda expression comparator treeset
1个回答
1
投票

您需要Comparator<Book>,而不是Comparator<String>。最简单的一种方法是使用Comparator.comparing

Comparator.comparing

0
投票

您正在寻找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的构造函数

© www.soinside.com 2019 - 2024. All rights reserved.