一、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. 网络攻击之二:XSS(之一是SQL注入,前面有文章)

    学习了 http://www.oschina.net/question/565065_57506 (这里做了转载 http://blog.csdn.net/stilling2006/article/d ...

  2. ViewPager的监听事件失效

    主要是因为在我项目使用了PageIndicator,所以这个时候监听事件要写在PageIndicator上. mIndicator.setOnPageChangeListener(new OnPage ...

  3. many to one could not resolve property

    今天在做一个功能的时候 遇到了.一个Could not resolve property 的问题. 配置文件如下: <many-to-one name="user"  cla ...

  4. xmlWriter 以UTF-8格式写xml问题

    dom4j中的XMLWriter提供以下几种构造方法: XMLWriter() XMLWriter(OutputFormat format) XMLWriter(OutputStream out) X ...

  5. HDU 3555 Bomb (数位DP-记忆化搜索模板)

    题意 求区间[1,n]内含有相邻49的数. 思路 比较简单的按位DP思路.这是第一次学习记忆化搜索式的数位DP,确实比递推形式的更好理解呐,而且也更通用~可以一般化: [数位DP模板总结] int d ...

  6. 【C#学习笔记】文本复制到粘贴板

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  7. ecshop init.php文件分析(转)

    <?php /** * ECSHOP 前台公用文件 */ //防止非法调用 defined-判断常量是否已定义,如果没返回false if (!defined('IN_ECS')) { die( ...

  8. application tips

    trace(ApplicationDomain.currentDomain == ApplicationDomain.currentDomain); trace(stage.loaderInfo.ap ...

  9. mysql 添加索引后 在查询的时候是mysql就自动从索引里面查询了。还是查询的时候有单 独的参数查询索引?

    MYSQL在创建索引后对索引的使用方式分为两种:1 由数据库的查询优化器自动判断是否使用索引:2 用户可在写SQL语句时强制使用索引 下面就两种索引使用方式进行说明第一种,自动使用索引.数据库在收到查 ...

  10. redo和undo的区别

    转摘:http://blog.163.com/jing_playboy/blog/static/757362222012520104521864/   redo--> undo-->dat ...