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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值