Использовать конструктор с лямбда-выражением (Set Comparator) - PullRequest
2 голосов
/ 10 апреля 2020

Мне дано задание использовать конструктор TreeSet (Comparator<E> comparator) с лямбда-выражением для сортировки набора по названию книги.

Дается следующая информация:

public class Book implements Comparable<Book> {
    private String isbn;
    private String title;
    private String author;

    public int compareTo(Book obj) {
      return isbn.compareTo(obj.isbn);
    }
    // all-args constructor and getters
}

То, о чем я до сих пор думал: я думаю, что конструктор позволяет вам определять Comparator. Возможно, мне следует сделать:

Comparator<String> comp = 
    (String title, String obj.title) -> (title.compareTo(obj.title));

Затем поместить этот комп в TreeSet<Book> bookSet = new TreeSet<Book>(comp);

Однако, похоже, это не работает. Я думаю, что мне нужно сделать, это использовать лямбда-выражение в той же строке при создании нового TreeSet, однако я не уверен, как это сделать.

Ответы [ 3 ]

3 голосов
/ 10 апреля 2020

Вам нужно Comparator<Book>, а не Comparator<String>. Самый простой способ получить это - использовать Comparator.comparing:

TreeSet<Book> bookSet = new TreeSet<>(Comparator.comparing(Book::getTitle));
1 голос
/ 10 апреля 2020

Книга:

public class 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 String getIsbn() {
    return isbn;
  }

  public void setIsbn(String isbn) {
    this.isbn = isbn;
  }

  public String getTitle() {
    return title;
  }

  public void setTitle(String title) {
    this.title = title;
  }

  public String getAuthor() {
    return author;
  }

  public void setAuthor(String author) {
    this.author = author;
  }

  @Override
  public String toString() {
    return "Book{" + "isbn='" + isbn + '\'' + ", title='" + title + '\'' + ", author='" + author + '\'' + '}';
  }
}

Основной класс:

import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;

public class Main {
  public static void main(String[] args) {
    Book book1 = new Book("isbn1", "First Book", "Author 1");
    Book book2 = new Book("isbn2", "Second Book", "Author 2");
    Book book3 = new Book("isbn3", "Third Book", "Author 3");

    //Method first
    Set<Book> books1 = new TreeSet<>((book, thisBook) -> book.getTitle().compareTo(thisBook.getTitle()));

    books1.add(book3);
    books1.add(book2);
    books1.add(book1);

    //Method second
    Set<Book> books2 = new TreeSet<>(Comparator.comparing(Book::getTitle));

    books2.add(book2);
    books2.add(book1);
    books2.add(book3);

    System.out.println(books1);
    System.out.println(books2);

  }
}

Когда вы вводите значения в set, поэтому я рекомендуем также добавлять hashcode и equals метод в класс Book, чтобы идентифицировать уникальный объект книги.

0 голосов
/ 10 апреля 2020

Вы ищете книгу компаратор. Даже если вы собираетесь сравнивать по названию книги, вам все равно придется использовать 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 в качестве аргумента в конструктор TreeSet

...