为了账号安全,请及时绑定邮箱和手机立即绑定

我不明白我们如何在方法 compareTo 中使用方法 compareTo

我不明白我们如何在方法 compareTo 中使用方法 compareTo

阿晨1998 2023-03-23 14:21:04
我正在做这个项目,在那里我会得到一些书,我应该按照这个逻辑对它进行排序:如果一本书的页数比另一本书的页数多,那么页数多的书排在第一位。如果两本书的页数相同,则按标题字母顺序排序。如果两本书的页数和标题相同,则按作者字母顺序排序。我试图解决但没有成功,所以我在解决方案中查找:public class Book implements Comparable<Book>{   public int compareTo(Book specifiedBook) {      // First check if they have different page counts      if(this.numberOfPages != specifiedBook.numberOfPages){         // this will return a negative value if this < specified but will return a positive value if this > specified         return this.numberOfPages - specifiedBook.numberOfPages;      }      // If page counts are identical then check if the titles are different      if(!this.title.equals(specifiedBook.title){         return this.title.compareTo(specifiedBook.title);      }      // If page titles are also identical then return the comparison of the authors      return this.author.compareTo(specifiedBook.author);    }}我在这里不明白的是这部分“return this.title.compareTo(specifiedBook.title);”。我们如何在方法 compareTo 中使用方法 compareTo,这不是递归吗,我知道当我们实现接口 comperable 时,我们必须覆盖方法 compareTo,但是我们如何在覆盖的 compareTo 方法中使用该 compareTo 方法?在这种情况下和一般情况下,它应该做什么?令我困惑的是,我们如何使用刚刚在接口中声明的方法,它不是从父类继承的。它只是在可比接口中声明,所以当我们实现接口时,我们必须重写它
查看完整描述

2 回答

?
慕虎7371278

TA贡献1802条经验 获得超4个赞

假设titleauthor是字符串,您正在String.compareTo从内部调用(已经实现)Book.compareTo。这不是递归。这是不同类中的方法。



查看完整回答
反对 回复 2023-03-23
?
SMILET

TA贡献1796条经验 获得超4个赞

使用 java.util.Comparator 比较字段的最简单和更好的方法。我强烈建议覆盖 equals 和 hashCode 方法,因为您要将书籍放在某个容器中,该容器可能是 Sorted Set 或类似的东西。无论如何,这是示例代码,


import org.junit.Test;


import java.util.Comparator;

import java.util.Objects;

import java.util.StringJoiner;

import java.util.TreeSet;


public class BookTest {


  @Test

  public void compareBooks() {

    Book b1 = new Book(100, "A book", "Zoro");

    Book b2 = new Book(10, "Small book", "ABC");

    TreeSet<Book> books = new TreeSet<>();

    books.add(b1);

    books.add(b2);

    System.out.println(books);

  }


  private class Book implements Comparable<Book> {

    private final int numberOfPages;

    private final String title;

    private final String author;


    private Book(int numberOfPages, String title, String author) {

      this.numberOfPages = numberOfPages;

      this.title = title;

      this.author = author;

    }


    public int getNumberOfPages() {

      return numberOfPages;

    }


    public String getTitle() {

      return title;

    }


    public String getAuthor() {

      return author;

    }


    @Override

    public int compareTo(Book that) {

      return Comparator.nullsFirst(

              Comparator.comparing(Book::getNumberOfPages)

                  .thenComparing(Book::getTitle)

                  .thenComparing(Book::getAuthor))

          .compare(this, that);

    }


    @Override

    public boolean equals(Object o) {

      if (this == o) return true;

      if (o == null || getClass() != o.getClass()) return false;

      Book book = (Book) o;

      return numberOfPages == book.numberOfPages

          && title.equals(book.title)

          && author.equals(book.author);

    }


    @Override

    public int hashCode() {

      return Objects.hash(numberOfPages, title, author);

    }


    @Override

    public String toString() {

      return new StringJoiner(", ", Book.class.getSimpleName() + "[", "]")

          .add("numberOfPages=" + numberOfPages)

          .add("title='" + title + "'")

          .add("author='" + author + "'")

          .toString();

    }

  }

}



查看完整回答
反对 回复 2023-03-23
  • 2 回答
  • 0 关注
  • 98 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信