一、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. 浅析JavaScript函数的参数

    ECAMScript函数不介意传递进来多少个参数,也不介意传递的参数的类型,即使定义的函数只接受两个参数,当调用该函数时没有传递参数,甚至传递了三个参数等等都无所谓,这是因为在ECAMScript中参 ...

  2. request.getRequestDispatcher()和response.sendRedirect()

    request.getRequestDispatcher("/homeMainAction_mainUI.do").forward(getRequest(), getRespons ...

  3. UVa 10935 (水题) Throwing cards away I

    直接用STL里的queue模拟即可. #include <cstdio> #include <queue> using namespace std; ; int discard ...

  4. HDU 1847 (博弈 找规律) Good Luck in CET-4 Everybody!

    为了提高题解质量还是简单证明一下:3的倍数是必败状态. 如果n % 3 = 1,那么拿走1个石子:如果n % 3 = 2,那么拿走两个石子,都将转移到3的倍数的状态.所以每个必胜状态都有一个后继是必败 ...

  5. (转)iOS动画Core Animation

    文章转载:http://blog.sina.com.cn/s/blog_7b9d64af0101b8nh.html 在iOS中动画实现技术主要是:Core Animation. Core Animat ...

  6. 菜鸟学习笔记2,$(document).ready()使用讨论

    $(document).ready()使用讨论 $(document).ready()  一.先为说说 $(document).ready() 的功能: 1. JQuery API对 $(docume ...

  7. How to: Modify a Project System So That Projects Load in Multiple Versions of Visual Studio

    http://msdn.microsoft.com/en-us/library/hh266706(v=VS.110).aspx

  8. Typed Message模式与Event Sourcing

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

  9. I.MX6 Android backlight modify by C demo

    /************************************************************************** * I.MX6 Android backligh ...

  10. postgresql - mac 启动 关闭 postgresql

    /Library/PostgreSQL/9.3/bin/pg_ctl -D /Library/PostgreSQL/9.3/data stop /Library/PostgreSQL/9.3/bin/ ...