【问题标题】:My Treeset only adds 1 class object我的 Treeset 只添加了 1 个类对象
【发布时间】:2016-11-02 15:34:17
【问题描述】:

我正在尝试将以下书籍对象添加到 TreeSet。但是,当我调试代码时,它说集合的大小为 1,并且只包含添加的第一个对象(book1)。当我注释掉 book1 时,book2 是唯一添加的等等。
为什么 JVm 只能识别一个对象?

代码:

 public static void main(String[] args) {
    Set<Book> bookSet = new TreeSet<Book>();

    Book book1 = new Book("Digital Fortress", "Dan Brown", "St. Martins Press", 1998);
    Book book2 = new Book("Angels and Demons", "Dan Brown", "Pocket Books", 2000);
    Book book3 = new Book("Deception Point", "Dan Brown", "Pocket Books", 2001);
    Book book4 = new Book("The Davinci Code", "Dan Brown", "DoubleDay", 2003);
    Book book5 = new Book("The Lost Symbol", "Dan Brown", "DoubleDay", 2009);
    Book book6 = new Book("Inferno", "Dan Brown", "DoubleDay", 2013);

    bookSet.add(book1);
    bookSet.add(book2);
    bookSet.add(book3);
    bookSet.add(book4);
    bookSet.add(book5);
    bookSet.add(book6);

    System.out.println(bookSet);
}

这里是到目前为止的全部代码(它必须都在同一个类中):

  import java.util.ArrayList;
  import java.util.Iterator;
  import java.util.List;
  import java.util.Set;
  import java.util.TreeSet;

public class Book implements Comparable<Book> {

String title;
String author;
String publisher;
int publicationYear;

List<String> authorList = new ArrayList<String>();

public Book(String title, String author, String publisher, int publicationYear){
    this.title = title;
    this.author = author;
    this.publisher = publisher;
    this.publicationYear = publicationYear;
}

public String getTitle() {
    return title;
}

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

public List<String> getAuthorList() {
    return authorList;
}

public void setAuthorList(List<String> authorList) {
    this.authorList = authorList;
}

public String getPublisher() {
    return publisher;
}

public void setPublisher(String publisher) {
    this.publisher = publisher;
}

public int getPublicationYear() {
    return publicationYear;
}

public void setPublicationYear(int publicationYear) {
    this.publicationYear = publicationYear;
}

public String getAuthor() {
    return author;
}

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


public String toString(){   
    return "Book Title: " + getTitle() + "\nAuthor Name: " + getAuthor() + "\nPublisher: " + getPublisher() + "\nYear of Publication: " + getPublicationYear();  
}

public static void main(String[] args) {
    Set<Book> bookSet = new TreeSet<Book>();

    Book book1 = new Book("Digital Fortress", "Dan Brown", "St. Martins Press", 1998);
    Book book2 = new Book("Angels and Demons", "Dan Brown", "Pocket Books", 2000);
    Book book3 = new Book("Deception Point", "Dan Brown", "Pocket Books", 2001);
    Book book4 = new Book("The Davinci Code", "Dan Brown", "DoubleDay", 2003);
    Book book5 = new Book("The Lost Symbol", "Dan Brown", "DoubleDay", 2009);
    Book book6 = new Book("Inferno", "Dan Brown", "DoubleDay", 2013);

    bookSet.add(book1);
    bookSet.add(book2);
    bookSet.add(book3);
    bookSet.add(book4);
    bookSet.add(book5);
    bookSet.add(book6);

    System.out.println(bookSet);
}

@Override
public int compareTo(Book o) {
    // TODO Auto-generated method stub
    return 0;
}  

}

【问题讨论】:

  • 请提供图书类代码
  • TreeSet 依赖于您的 Book 类中的代码来完成其工作(例如调用该类的 equals/hashCode 方法)。因此,很可能,您对这些方法的实现 不是应有的样子。例如,您想阅读 tutorials.jenkov.com/java-collections/hashcode-equals.html 之类的内容
  • TODO Auto-generated method stub。应该用实际代码替换它..

标签: java collections treeset


【解决方案1】:

所有书籍彼此相等(通过返回 0 来证明)。 Set 不能包含重复项,所以这就是为什么只添加一个(第一本书)

@Override
public int compareTo(Book o) {
    // TODO Auto-generated method stub
    return 0;
}  

您需要填写方法的详细信息。负数表示this book 小于o,正数反之亦然

【讨论】:

  • 为了对 OP 公平起见,Javadoc for add() 表示只有当集合中不包含 equals() 这个元素的元素时才会添加元素。这是错误的。它应该说它是否不包含 compareTo() 返回 0 的元素。not requiredcompareToequals 是一致的。如果 TreeSet 确实使用了equals(),那么 OP 的代码应该可以工作。
  • 当然,但是如果您阅读了其余的文档。 TreeSet 实例使用它的 compareTo(或 compare)方法执行所有元素比较,因此从集合的角度来看,此方法认为相等的两个元素是相等的。
  • 你说得对,TreeSet 文档指出compareTo() 必须与equals() 的所有元素保持一致。
【解决方案2】:
@Override
public int compareTo(Book o) {
    // TODO Auto-generated method stub
    return 0;
}

Comparable#compareTo 返回值说明了什么 -

一个负整数、零或一个正整数,因为这个对象小于 大于、等于或大于指定对象。 documentation

当您将多个对象添加到树集合时,TreeSet 实例使用其compareTo(或compare)方法执行所有元素比较,因此从集合的角度来看,此方法认为相等的两个元素是, 相等。所有对象都等于Book对象compareTo方法(提供)定义,所以TreeSet只是忽略了重复对象。

解决方案: 正确定义 compareTo 方法,记住这件事返回值应该 负整数、零或正整数,因为此对象小于、等于或大于指定对象。

【讨论】:

    【解决方案3】:

    根据您的要求更新您的 compareTo 方法。或者至少更新如下,它将允许在树集中插入所有对象。

    public int compareTo(Book o) {
    // TODO Auto-generated method stub
    return this.compareTo(o);
    } 
    

    【讨论】:

      猜你喜欢
      • 2014-03-31
      • 2016-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-13
      • 1970-01-01
      相关资源
      最近更新 更多