JAVA中TreeSet集合存储类,类必须实现Compareble接口

来源:互联网 发布:南京java程序员工资 编辑:程序博客网 时间:2024/06/13 02:37

TreeSet是有序不可重复集,具有以下特点:
1、数据会按自然排序(可以理解为从小到大排序)
2、不可存储null
3、数据不可重复
4、非线程安全

数字会从小到大进行排序—–例子:

package com.ckinghan.collectionDemo;import java.util.Date;import java.util.Set;import java.util.TreeSet;public class TreeSetDemo {    /**     *      * @描述:TreeSet集合的特点:     *              1、数据会按自然排序(可以理解为从小到大排序)     *              2、不可存储null     *              3、数据不可重复     *              4、非线程安全     *      * @时间:2017年5月9日22:41:41     * @注意:     * @作者:Ckinghan     * @param args     */    public static void main(String[] args) {        /**         * 创建一个数字类型的treeSet有序不重复集并赋Integer类型的值         * 查看集合的结果,会按从小到大的顺序的排序         */        Set<Integer> set = new TreeSet<>();        set.add(1);        set.add(9);        set.add(4);        set.add(2);        set.add(5);        set.add(8);        set.add(3);        set.add(1);        System.out.println(set);    }}执行结果:[1, 2, 3, 4, 5, 8, 9]从结果上可以发现,数值“1”分明存储了两次,却只能留存一个,这说明TreeSet不能保存重复的值,并且结果是从小到大排序的

字符串会将每个字符的ACIIS拿出来进行对比并排序—–例子:

package com.ckinghan.collectionDemo;import java.util.Date;import java.util.Set;import java.util.TreeSet;public class TreeSetDemo {    /**     *      * @描述:TreeSet集合的特点:     *              1、数据会按自然排序(可以理解为从小到大排序)     *              2、不可存储null     *              3、数据不可重复     *              4、非线程安全     *      * @时间:2017年5月9日22:41:41     * @注意:     * @作者:Ckinghan     * @param args     */    public static void main(String[] args) {        /**         * 创建一个String类型的TreeSet集合         * 因为String实现了Comparable接口,所以可以在TreeSet集合存储并排序         */        Set<String> set2 = new TreeSet<String>();        set2.add("wod");        set2.add("abe");        set2.add("abc");        System.out.println(set2);    }}执行结果:[abc, abe, wod]可以看出,字符串是按字母从小到大排序的。

对于程序员所写的类,如果没有实现Comparable接口,是无法放到treeSet集合中的,示例代码如下:

package com.ckinghan.collectionDemo;import java.util.Date;/** * @author:Ckinghan *  @date:2017年5月9日22:36:28 *  @描述:测试实体类,用以实现Comparable接口,在treeSet集合中进行排序,本次代码没有实现Comparable接口 */public class Enity {    public Integer id;    public String tableName;    public Date createTime;    public Integer getId() {        return id;    }    public void setId(Integer id) {        this.id = id;    }    public String getTableName() {        return tableName;    }    public void setTableName(String tableName) {        this.tableName = tableName;    }    public Date getCreateTime() {        return createTime;    }    public void setCreateTime(Date createTime) {        this.createTime = createTime;    }    public Enity() {        super();    }    public Enity(Integer id, String tableName, Date createTime) {        super();        this.id = id;        this.tableName = tableName;        this.createTime = createTime;    }}测试代码如下:package com.ckinghan.collectionDemo;import java.util.Date;import java.util.Set;import java.util.TreeSet;public class TreeSetDemo {    /**     *      * @描述:TreeSet集合的特点:     *              1、数据会按自然排序(可以理解为从小到大排序)     *              2、不可存储null     *              3、数据不可重复     *              4、非线程安全     *      * @时间:2017年5月9日22:41:41     * @注意:     * @作者:Ckinghan     * @param args     */    public static void main(String[] args) {        /**         * 如果类没有实现Comparable接口,是无法存储在treeSet集合中的         */        Set<Enity> set3 = new TreeSet<>();        set3.add(new Enity(1, "employeeInfo", new Date()));        set3.add(new Enity(2, "employeeInfo", new Date()));        set3.add(new Enity(3, "employeeInfo", new Date()));        set3.add(new Enity(4, "employeeInfo", new Date()));        set3.add(new Enity(1, "employeeInfo", new Date()));        System.out.println(set3);    }}运行结果如下 :Exception in thread "main" java.lang.ClassCastException: com.ckinghan.collectionDemo.Enity cannot be cast to java.lang.Comparable    at java.util.TreeMap.compare(TreeMap.java:1294)    at java.util.TreeMap.put(TreeMap.java:538)    at java.util.TreeSet.add(TreeSet.java:255)    at com.ckinghan.collectionDemo.TreeSetDemo.main(TreeSetDemo.java:55)

程序员自己定义 的类,要实现了Comparable接口后方可存储到treeSet集合中,示例代码如下 :

package com.ckinghan.collectionDemo;import java.util.Date;/** * @author:Ckinghan *  @date:2017年5月9日22:36:28 *  @描述:测试实体类,用以实现compareTo接口,在treeSet集合中进行排序 */public class Enity  implements Comparable<Enity>{    public Integer id;    @Override    public String toString() {        return "Enity [id=" + id + ", tableName=" + tableName + ", createTime=" + createTime + "]";    }    public String tableName;    public Date createTime;    public Integer getId() {        return id;    }    public void setId(Integer id) {        this.id = id;    }    public String getTableName() {        return tableName;    }    public void setTableName(String tableName) {        this.tableName = tableName;    }    public Date getCreateTime() {        return createTime;    }    public void setCreateTime(Date createTime) {        this.createTime = createTime;    }    public Enity() {        super();    }    public Enity(Integer id, String tableName, Date createTime) {        super();        this.id = id;        this.tableName = tableName;        this.createTime = createTime;    }    /**     * 重写compareTo方法,否则无法存储到treeSet集合中     */    @Override    public int compareTo(Enity o) {        //对比是否this大于o        int val = this.id - o.id;        //如果两者相同        if(val == 0){            //判断tableName是否为空,如果不为空,则判断两者的tableName是否相等            if(this.tableName != null ){                //获取对比的值                 val = this.tableName.compareTo(o.tableName);                //如果两都的tableName相等,则判断两都的createTime是否相等                if(val == 0){                    //注意:这里不建议使用getTime()再相减,因为如果时间相差过大,可能超过int的最大值,即使不大于int的最大值,最后还是要再强转为int                    val = this.createTime.compareTo(o.createTime);                }            }        }        return val;    }}测试类代码:package com.ckinghan.collectionDemo;import java.util.Date;import java.util.Set;import java.util.TreeSet;public class TreeSetDemo {    /**     *      * @描述:TreeSet集合的特点:     *              1、数据会按自然排序(可以理解为从小到大排序)     *              2、不可存储null     *              3、数据不可重复     *              4、非线程安全     *      * @时间:2017年5月9日22:41:41     * @注意:     * @作者:Ckinghan     * @param args     */    public static void main(String[] args) {        /**         * 如果类没有实现compareTo接口,是无法存储在treeSet集合中的         */        Set<Enity> set3 = new TreeSet<>();        set3.add(new Enity(1, "employeeInfo", new Date()));        set3.add(new Enity(2, "employeeInfo", new Date()));        set3.add(new Enity(3, "employeeInfo", new Date()));        set3.add(new Enity(4, "employeeInfo", new Date()));        set3.add(new Enity(1, "employeeInfo", new Date()));        /**         * 循环打印set3集合中的内容         */        for(Enity enity : set3){            System.out.println(enity);        }    }}执行结果:Enity [id=1, tableName=employeeInfo, createTime=Tue May 09 23:16:06 CST 2017]Enity [id=2, tableName=employeeInfo, createTime=Tue May 09 23:16:06 CST 2017]Enity [id=3, tableName=employeeInfo, createTime=Tue May 09 23:16:06 CST 2017]Enity [id=4, tableName=employeeInfo, createTime=Tue May 09 23:16:06 CST 2017]注意:我添加了两个ID为1的数据,结果却出现了一个,应该是最终的返回值 为0影响的,但我也不敢肯定,因为在添加第一条数据时,返回的也是0。还需要再查询资料才能确定。

找到了一篇文章 ,它说返加0时确实会做为是否重复的参考标准之一,但为什么第一个添加的值返回的也是0,去可以添加呢?还要找相关的资料才行

参考资料一:http://blog.csdn.net/yxb_yingu/article/details/52194988

0 0
原创粉丝点击