2 qq 31930741 qq_31930741 于 2016.04.15 22:33 提问

java关于TreeSet集合的问题,为什么每次添加只能添加进去一个,再添加的时候就会覆盖掉前面那个

不知道为什么只能添加一个对象进去,添加第二次的时候就覆盖掉了第一次添加进去的。麻烦大家了!

这是main方法
if("a".equalsIgnoreCase(option)){
//查看图书的功能
d.cheekBook();
}
else if("b".equalsIgnoreCase(option)){
//添加图书的功能
System.out.println("请输入书名:");
bookName=sc.next();
System.out.println("请输入作者:");
author=sc.next();
System.out.println("请输入出版社:");
press=sc.next();
System.out.println("请输入价格:");
price=sc.next();
System.out.println("请输入书号:");
bookID=sc.next();
System.out.println("请输入出版日期:");
pubdate=sc.next();
boolean bl2=d.addBook(bookName,author,press,price,bookID,pubdate);
if(bl2){
System.out.println("添加成功");
System.out.println("请选择功能:查看图书(A) 添加图书(B) 修改图书(C) 删除图书(D)");
option=sc.next();
if("a".equalsIgnoreCase(option)){
//查看图书
d.cheekBook();
}
else if("b".equalsIgnoreCase(option)){
//添加图书
System.out.println("请输入书名:");
bookName=sc.next();
System.out.println("请输入作者:");
author=sc.next();
System.out.println("请输入出版社:");
press=sc.next();
System.out.println("请输入价格:");
price=sc.next();
System.out.println("请输入书号:");
bookID=sc.next();
System.out.println("请输入出版日期:");
pubdate=sc.next();
bln=d.addBook(bookName,author,press,price,bookID,pubdate);
if(bln){
System.out.println("添加成功");
}
}

    这是添加图书和查看图书的的方法                       
                                //创建book对象
Book book=new Book();
//创建TreeSet集合,里面储存book对象的属性
TreeSet<Book> tree=new TreeSet<Book>();
//查看图书的功能
public void cheekBook(){
    if(tree.isEmpty()){
        System.out.println("请添加图书!!!");
    }
    else{
        System.out.println("查看图书");
        System.out.println("|书名|     |作者|     |出版社|    |价格|   |书号|   |出版日期|");
        Iterator<Book> it=tree.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }

    }
}

//添加图书
public boolean addBook(String bookName, String author, String press, String price, String bookID, String pubdate){
    boolean bl2=false;
    book.setBookName(bookName);
    book.setAuthor(author);
    book.setPress(press);
    book.setPrice(price);
    book.setBookID(bookID);
    book.setPubdate(pubdate);
    System.out.println("新书信息如下:"+book.toStrings());
    System.out.println("是否保存该书? (Y)是 (N)否");
    option=sc.next();
    if("y".equalsIgnoreCase(option)){
        System.out.println("正在添加....");
        tree.add(book);//把图书的信息添加到tree集合中
        bl2=true;
    }
    else{
        System.out.println("已取消");
    }
    return bl2;
}

2个回答

a156384
a156384   2016.04.15 22:50
已采纳

Book book=new Book();
//创建TreeSet集合,里面储存book对象的属性
TreeSet tree=new TreeSet();

第一次添加的是book对象,保存到tree中。tree获得book的地址。
第二次添加的还是book对象,只是改了下值。保存到tree中进行覆盖。

第一个修改的地方
//创建引用名,不new对象
Book book ;
//创建TreeSet集合,里面储存book对象的属性
TreeSet tree=new TreeSet();

第二个修改的地方
public boolean addBook(String bookName, String author, String press, String price, String bookID, String pubdate){
boolean bl2=false;

    //在方法中new对象,可以保证每次的对象不一样
    book = new Book();

book.setBookName(bookName);
book.setAuthor(author);
book.setPress(press);
book.setPrice(price);
book.setBookID(bookID);
book.setPubdate(pubdate);
System.out.println("新书信息如下:"+book.toStrings());
System.out.println("是否保存该书? (Y)是 (N)否");
option=sc.next();
if("y".equalsIgnoreCase(option)){
    System.out.println("正在添加....");
    tree.add(book);//把图书的信息添加到tree集合中
    bl2=true;
}
else{
    System.out.println("已取消");
}
return bl2;

}

qq_31930741
qq_31930741 真的非常感谢你,这是老师让我们完成的一个小项目。你的回答让我又学到了一个以前忽略的知识点,谢谢!
2 年多之前 回复
qq_31930741
qq_31930741 谢谢,非常感谢!!!
2 年多之前 回复
renwotao2009
renwotao2009   2016.04.16 08:33

看一楼,你每次都修改的是一个book对象,自然是覆盖掉以前的,add是每次都new一个

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
关于TreeSet内添加具体的自定义对象的排序
TreeSet是一个有序集合,TreeSet中的元素将按照升序排列,缺省是按照自然排序进行排列
Java中TreeSet的add操作失败的问题
欢迎转载,转载请在醒目处注明出处,Ron’s Blog: http://www.neilron.xyz/fail-to-add-into-a-treeset/最近在工作中碰到一个问题,经过一行行debug最终定位到了是一个TreeSet无法add新条目的问题。Google一番发现了TreeSet和HashSet用法有些不同,不仅不能插入Hash相同的对象,也不能插入在排序中和已有元素等价的值。
List集合添加对象(覆盖问题解决)
今天在做一个项目的时候,发现了一个问题,我直接放代码:@Override public void populate(ProductModel source, StockData stockData) throws ConversionException { try { ArrayList&amp;lt;FutureStockLevelData&amp;gt; list = new ArrayList&amp;l...
List集合add方法覆盖原来的内容解决办法
今天遇到一个有意思的问题,当我遍历数组的同时在for循环中使用list.add(),但这样会将之前的内容也覆盖掉。本来有3条数据,但这样会得到三条相同的数据 解决办法:   在循环中将你的对象再new一次 原因:   当使用List时,如果T是引用类型,保存的是引用,如果是值类型,保存的是值本身。 1、T是对象是,也就是说如果是引类型时,在循环外边已经new了一个对象,相当于这个对象的地
使用ArrayList.add()时 后面的数据完全覆盖前面的数据
今天在写项目时发现了一个bugquestion = new Question(); question = GetQuestion.GetQuestion(str); list.add(question);GetQuestion中的GetQuestion方法是解析传入的字符串,以question对象返回。但是之后发现之后解析的question会覆盖list中前面的question,结果是list中全是
黑马程序员——TreeSet集合添加元素的原理
TreeSet集合是树集(二叉树)数据结构,其在向集合中存入元素时,会将存入的元素与树集上的元素进行对比,如果此元素在树集上不存在,那么在对比后会将此元素存入树集上适当的位置。那么此元素与树集上元素的对比的原理是什么?   Comparable接口实现排序:          在默认情况下,树集每插入一个元素会调用此元素的compareTo方法来和树集中的元素依次对比,因此java将com
Java 使用ArrayList.add() 前面所有值被 覆盖 的问题
ArrayList.add后,前面数据被覆盖的问题多次搜寻,没有讲的很清楚的答案,所有发表本篇文章。 导致这个现象最根本的原因*** * *根源就是ArrayList集合里存的是同一个值,有可能是同一个引用或者就是同一个值。 *请看下面详解 * *** 下面分情况讲述(逐步添加可能情况,欢迎在讨论区提出)1.涉及循环添加ArrayList<Object> list = new ArrayList<
java之TreeSet里添加自定义对象
以一个例子来说明: package javastudy; import java.util.Comparator; import java.util.Iterator; import java.util.TreeSet; //一一个类文件里面可以有多个类,但是只能有一个public类,且public类的名字要和文件的名字相同 public class Testit {
TreeSet方法之一 向TreeSet中添加的元素
package andycpp; import java.util.Iterator; import java.util.Set; import java.util.TreeSet; import org.junit.Test; /** * Collection接口: * List接口 * ArrayList(主要的实现类) * LinkedList(对于频繁的插
解决list.add() 方法会覆盖前面的已经添加好的参数
Map map = new HashMap();       //mark1 List> list = new ArrayList>(); for(int i=0;i // map=new HashMap();     //mark2 map.clear(); map.put("title", i+d); map.put("content", i+e); list.add(map);