一、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. Java生成可执行文件 & MANIFEST.MF问题 METAINFO

    用 Intellij 进行打包.在File -> Project Structure里面. 然后应该会自动生成Jar包(也可以Build->Build Artifacts) xxx.jar ...

  2. ACM - ICPC World Finals 2013 I Pirate Chest

    原题下载:http://icpc.baylor.edu/download/worldfinals/problems/icpc2013.pdf 题目翻译: 问题描述 海盗Dick受够了在公海上厮杀.抢劫 ...

  3. innodb锁之间的兼容性判断

    检查锁与锁之间的兼容性 路径:/mysql-5.5.43/storage/innobase/lock/lock0lock.c 实现:见锁的强度比较  row 可理解为 lock 的锁模式  colum ...

  4. AWS 之Load Balance篇

    public class CreateELB { /// <summary> /// 连接AWS服务器 /// </summary> /// <param name=&q ...

  5. 示例可重用的web component方式组织angular应用模块

    在online web应用中,经常有这样的需求,能够让用户通过浏览器来输入代码,同时能够根据不同的代码来做语法高亮.大家已知有很多相应的javascript库来实现语法高亮的功能,比如codemirr ...

  6. Codeforces 424 B Megacity【贪心】

    题意:给出城市(0,0),给出n个坐标,起始人数s,每个坐标k个人, 每个坐标可以覆盖到半径为r的区域,r=sqrt(x*x+y*y)的区域,问最小的半径是多少,使得城市的总人数大于等于1000000 ...

  7. Typed Message模式与Event Sourcing

    引言 在<设计模式沉思录>(Pattern Hatching: Design Patterns Applied,[美]JohnVlissides著)一书的第4章中,围绕事件Message传 ...

  8. hihoCoder #1182 欧拉路·三 (变形)

    题意: 写出一个环,环上有2^n个格子,每个格子中的数字是0或1,相连着的n个格子可以组成一个数的二进制,要求给出这2^n个数字的序列,使得组成的2^n个数字全是不同的.(即从0到2^n-1) 思路: ...

  9. 【C#学习笔记】函数调用

    using System; namespace ConsoleApplication { class Program { static int Add(int a, int b) { return a ...

  10. ecshop 调用指定分类的推荐,热卖,新品

    未测试 1.includes/lib_goods.php文件.把SQL语句改一下,与category表关联即可 将 $sql = 'SELECT g.goods_id,g.goods_name, g. ...