一、TreeSet原理:

1.TreeSet存储对象的时候, 可以排序, 但是需要指定排序的算法

2.Integer能排序(有默认顺序), String能排序(有默认顺序), 自定义的类存储的时候出现异常(没有顺序)

3.如果想把自定义类的对象存入TreeSet进行排序, 那么必须实现Comparable接口,或者实现一个比较器

在类上implements Comparable
             重写compareTo()方法
             在方法内定义比较算法, 根据大小关系, 返回正数负数或零
             在使用TreeSet存储对象的时候, add()方法内部就会自动调用compareTo()方法进行比较, 根据比较结果使用二叉树形式进行存储

4.TreeSet依靠TreeMap来实现

二、TreeSet实现有序的2种方式

1)、元素实现Comparable接口:

实例:

实体类User(实现Comparable接口):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
 
package com.model.elgin.collections;

public class Userimplements Comparable<User>{
   
    private int id;
    private String name;
    private String phone;
    
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
    
    public User(int id,String name,String
phone) {
        super();
        this.id = id;
        this.name = name;
        this.phone = phone;
    }
    
    @Override
    public String toString() {
        return "User [id=" + id +", name=" + name
+", phone=" + phone +"]";

    }
    
    @Override
    public int compareTo(User user) {
        if(this.id>user.getId()){
            ;
        } else if(this.id==user.getId()){
            ;
        }
        ;
    }
}

测试类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 
package com.model.elgin.collections;

import java.util.Set;
import java.util.TreeSet;

public class TestTreeSet {
    
    public static void main(String[]
args) {
        
        /*
         * TreeSet有序、唯一。
         * 实现有序的2种方式:
         * 1.集合中的元素对象实现Comparable接口,TreeSet声明使用无参构造
         * 2.声明一个比较器 Comparator ,TreeSet声明使用有参构造,参数传入比较器的一个实例对象
         * 
         */
        Set<User> set=new TreeSet<User>();
        User user1=,"jim",
"13232326565");

        User user2=,"jack",
"13232326566");

        User user3=,"lily",
"13232326567");

        User user4=,"lucy",
"13232326568");

        User user5=,"lucy",
"13232326568");

        set.add(user1);
        set.add(user3);
        set.add(user4);
        set.add(user2);
        set.add(user5);
        System.out.println(set);
    }
}

运行之后发现结果有序(根据id由小到大)排列

2)、通过自定义比较器实现(User类不需要实现Comparable接口):

比较器类: UserComparator

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
package com.model.elgin.collections;

import java.util.Comparator;

public class UserComparatorimplements Comparator<User>
{

@Override
    public int compare(User user1, User user2) {
        if(user1.getId()>user2.getId()){
            ;
        }else if(user1.getId()==user2.getId()){
            ;
        }
        ;
    }   
}

测试类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
 
package com.model.elgin.collections;

import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;

public class TestTreeSet {
    
    public static void main(String[]
args) {
        
        /*
         * TreeSet有序、唯一。
         * 实现有序的2种方式:
         * 1.集合中的元素对象实现Comparable接口,TreeSet声明使用无参构造
         * 2.声明一个比较器 Comparator ,TreeSet声明使用有参构造,参数传入比较器的一个实例对象
         * 
         */
        Comparator<User> comparator=new UserComparator();
        Set<User> set=new TreeSet<User>(comparator);
        User user1=,"jim",
"13232326565");

        User user2=,"jack",
"13232326566");

        User user3=,"lily",
"13232326567");

        User user4=,"lucy",
"13232326568");

        User user5=,"lucy",
"13232326568");

        set.add(user1);
        set.add(user3);
        set.add(user4);
        set.add(user2);
        set.add(user5);
        System.out.println(set);
    }
}

运行,同样可以得到上述有序的结果。

TreeSet介绍的更多相关文章

  1. java集合系列——Set之HashSet和TreeSet介绍(十)

    一.Set的简介 Set是一个不包含重复元素的 collection.更确切地讲,set 不包含满足 e1.equals(e2) 的元素.对 e1 和 e2,并且最多包含一个为 null 的元素. S ...

  2. Java 集合系列17之 TreeSet详细介绍(源码解析)和使用示例

    概要 这一章,我们对TreeSet进行学习.我们先对TreeSet有个整体认识,然后再学习它的源码,最后再通过实例来学会使用TreeSet.内容包括:第1部分 TreeSet介绍第2部分 TreeSe ...

  3. Java 集合系列 17 TreeSet

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  4. TreeSet源码分析

    第1部分 TreeSet介绍 TreeSet 是一个有序的集合,它的作用是提供有序的Set集合.它继承于AbstractSet抽象类,实现了NavigableSet<E>, Cloneab ...

  5. Java集合(6):TreeSet

    一.TreeSet介绍 与HashSet是基于HashMap实现一样,TreeSet是基于TreeMap实现的.TreeSet是一个有序集合,TreeSet中的元素将按照升序排列,缺省是按照自然排序进 ...

  6. java源码之TreeSet

    1,TreeSet介绍 1)TreeSet 是一个有序的集合,它的作用是提供有序的Set集合.2)TreeSet 继承于AbstractSet,所以它是一个Set集合,具有Set的属性和方法.3)Tr ...

  7. Java集合--TreeSet

    转载请注明出处:http://www.cnblogs.com/skywang12345/admin/EditPosts.aspx?postid=3311268 第1部分 TreeSet介绍 TreeS ...

  8. Java中TreeSet的详细用法

    第1部分 TreeSet介绍 TreeSet简介 TreeSet 是一个有序的集合,它的作用是提供有序的Set集合.它继承于AbstractSet抽象类,实现了NavigableSet, Clonea ...

  9. Java基础知识笔记(八:集合类)

    目录 1  集合类简介  2  List介绍及简单使用 2.1  LinkedList介绍及简单使用 2.2  ArrayList介绍及简单使用 2.3  Vector介绍及简单使用 2.3.1  S ...

随机推荐

  1. win7 64位系统 Oracle32bit + PL/SQL访问Orale服务,Oracle 11g的安装,中文乱码问题的解决

    前几天装了个Oracle32bit客户端 + PL/SQL连接不上oracle,我安装完打开PL/SQL登录界面跟正常的界面不一样,没有那个连接为Normal.SYSDBA的选项,下面有解释,至于我为 ...

  2. Gson解析POJO类中的泛型参数

    在开发Android与API交互的时候,使用Json格式传输,遇到了这样一个情况,返回数据格式POJO类如下: public class ApiResult<T> { private in ...

  3. 浏览器兼容的css hack

    <style> div{ background:green; /* for firefox */ *background:red; /* for IE6 */ } </style&g ...

  4. 用Access作为后台数据库支撑,书写一个C#写入记录的案例

    要想操作一个数据库,不论是那种操作,首先要做的肯定是打开数据库. 下面我们以ACCESS数据库来做例子说明如何打开一个数据库连接!   在这里我们需要用到的是: System.Data.OleDb.O ...

  5. WEBUS2.0 In Action - 搜索操作指南 - (2)

    上一篇:WEBUS2.0 In Action - 搜索操作指南(1) | 下一篇:WEBUS2.0 In Action - 搜索操作指南(3) 2. 使用Query Query是所有查询的基类, 它一 ...

  6. BZOJ 1076 奖励关

    注意几点: 1.为什么要逆推?由此状态可以轻易算出彼状态是否可行,而彼状态却无法轻易还原为此状态. 2.为什么可以逆推?假设时光倒流了....23333 3.注意位运算的准确,大胆写方程. #incl ...

  7. Android udev /dev 设备节点权限

    /************************************************************************* * Android udev /dev 设备节点权 ...

  8. Windows bat with adb

    /********************************************************************* * Windows bat with adb * 说明: ...

  9. .CO域名快被这帮搞IT的玩坏了……

    鉴于近来国内访问Google的服务受阻,greatfire.org于前天推出了其基于亚马逊AWS的Google搜索镜像网站,地址是sinaapp.co.该网站随后因多家海外媒体的报道和众多微博大V的转 ...

  10. Dataguard后台进程解析

    Log Transport Service   主节点上,日志传输服务主要使用如下几个进程: 1.LGWR     LGWR搜集事务日志,并且更新联机日志.在同步模式下,LGWR直接将redo信息直接 ...