博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java学习笔记(36)——Java集合08之TreeSet
阅读量:6346 次
发布时间:2019-06-22

本文共 6521 字,大约阅读时间需要 21 分钟。

  hot3.png

一、概述

TreeSet简介

TreeSet 是一个有序的集合,它的作用是提供有序的Set集合。它继承于AbstractSet抽象类,实现了NavigableSet<E>, Cloneable, java.io.Serializable接口。

TreeSet 继承于AbstractSet,所以它是一个Set集合,具有Set的属性和方法。
TreeSet 实现了NavigableSet接口,意味着它支持一系列的导航方法。比如查找与指定目标最匹配项。
TreeSet 实现了Cloneable接口,意味着它能被克隆。
TreeSet 实现了java.io.Serializable接口,意味着它支持序列化。

TreeSet是基于TreeMap实现的。TreeSet中的元素支持2种排序方式:自然排序 或者 根据创建TreeSet 时提供的 Comparator 进行排序。这取决于使用的构造方法。

TreeSet为基本操作(add、remove 和 contains)提供受保证的 log(n) 时间开销。
另外,TreeSet是非同步的。 它的iterator 方法返回的迭代器是fail-fast的。

 

TreeSet的构造函数

// 默认构造函数。使用该构造函数,TreeSet中的元素按照自然排序进行排列。TreeSet()// 创建的TreeSet包含collectionTreeSet(Collection
 collection)// 指定TreeSet的比较器TreeSet(Comparator
 comparator)// 创建的TreeSet包含setTreeSet(SortedSet
 set)

TreeSet的API

boolean                   add(E object)boolean                   addAll(Collection
 collection)void                      clear()Object                    clone()boolean                   contains(Object object)E                         first()boolean                   isEmpty()E                         last()E                         pollFirst()E                         pollLast()E                         lower(E e)E                         floor(E e)E                         ceiling(E e)E                         higher(E e)boolean                   remove(Object object)int                       size()Comparator
     comparator()Iterator
               iterator()Iterator
               descendingIterator()SortedSet
              headSet(E end)NavigableSet
           descendingSet()NavigableSet
           headSet(E end, boolean endInclusive)SortedSet
              subSet(E start, E end)NavigableSet
           subSet(E start, boolean startInclusive, E end, boolean endInclusive)NavigableSet
           tailSet(E start, boolean startInclusive)SortedSet
              tailSet(E start)

说明

(01) TreeSet是有序的Set集合,因此支持add、remove、get等方法。

(02) 和NavigableSet一样,TreeSet的导航方法大致可以区分为两类,一类时提供元素项的导航方法,返回某个元素;另一类时提供集合的导航方法,返回某个集合。
lower、floor、ceiling 和 higher 分别返回小于、小于等于、大于等于、大于给定元素的元素,如果不存在这样的元素,则返回 null。

二、TreeSet数据结构

TreeSet的继承关系

java.lang.Object   ↳     java.util.AbstractCollection
         ↳     java.util.AbstractSet
               ↳     java.util.TreeSet
public class TreeSet
 extends AbstractSet
            implements NavigableSet
, Cloneable, java.io.Serializable{}

TreeSet与Collection关系如下图:

从图中可以看出:

(01) TreeSet继承于AbstractSet,并且实现了NavigableSet接口。
(02) TreeSet的本质是一个"有序的,并且没有重复元素"的集合,它是通过TreeMap实现的。TreeSet中含有一个"NavigableMap类型的成员变量"m,而m实际上是"TreeMap的实例"。

三、TreeSet遍历方式

3.1 Iterator顺序遍历

for(Iterator iter = set.iterator(); iter.hasNext(); ) {     iter.next();}

3.2 Iterator顺序遍历

// 假设set是TreeSet对象for(Iterator iter = set.descendingIterator(); iter.hasNext(); ) {     iter.next();}

3.3 for-each遍历HashSet

// 假设set是TreeSet对象,并且set中元素是String类型String[] arr = (String[])set.toArray(new String[0]);for (String str:arr)    System.out.printf("for each : %s\n", str);

TreeSet不支持快速随机遍历,只能通过迭代器进行遍历!

 

TreeSet遍历测试程序如下:

import java.util.*;/** * @desc TreeSet的API测试 * * @author skywang * @email kuiwu-wang@163.com */public class TreeSetTest {    public static void main(String[] args) {        testTreeSetAPIs();    }        // 测试TreeSet的api    public static void testTreeSetAPIs() {        String val;        // 新建TreeSet        TreeSet tSet = new TreeSet();        // 将元素添加到TreeSet中        tSet.add("aaa");        // Set中不允许重复元素,所以只会保存一个“aaa”        tSet.add("aaa");        tSet.add("bbb");        tSet.add("eee");        tSet.add("ddd");        tSet.add("ccc");        System.out.println("TreeSet:"+tSet);        // 打印TreeSet的实际大小        System.out.printf("size : %d\n", tSet.size());        // 导航方法        // floor(小于、等于)        System.out.printf("floor bbb: %s\n", tSet.floor("bbb"));        // lower(小于)        System.out.printf("lower bbb: %s\n", tSet.lower("bbb"));        // ceiling(大于、等于)        System.out.printf("ceiling bbb: %s\n", tSet.ceiling("bbb"));        System.out.printf("ceiling eee: %s\n", tSet.ceiling("eee"));        // ceiling(大于)        System.out.printf("higher bbb: %s\n", tSet.higher("bbb"));        // subSet()        System.out.printf("subSet(aaa, true, ccc, true): %s\n", tSet.subSet("aaa", true, "ccc", true));        System.out.printf("subSet(aaa, true, ccc, false): %s\n", tSet.subSet("aaa", true, "ccc", false));        System.out.printf("subSet(aaa, false, ccc, true): %s\n", tSet.subSet("aaa", false, "ccc", true));        System.out.printf("subSet(aaa, false, ccc, false): %s\n", tSet.subSet("aaa", false, "ccc", false));        // headSet()        System.out.printf("headSet(ccc, true): %s\n", tSet.headSet("ccc", true));        System.out.printf("headSet(ccc, false): %s\n", tSet.headSet("ccc", false));        // tailSet()        System.out.printf("tailSet(ccc, true): %s\n", tSet.tailSet("ccc", true));        System.out.printf("tailSet(ccc, false): %s\n", tSet.tailSet("ccc", false));        // 删除“ccc”        tSet.remove("ccc");        // 将Set转换为数组        String[] arr = (String[])tSet.toArray(new String[0]);        for (String str:arr)            System.out.printf("for each : %s\n", str);        // 打印TreeSet        System.out.printf("TreeSet:%s\n", tSet);        // 遍历TreeSet        for(Iterator iter = tSet.iterator(); iter.hasNext(); ) {            System.out.printf("iter : %s\n", iter.next());        }        // 删除并返回第一个元素        val = (String)tSet.pollFirst();        System.out.printf("pollFirst=%s, set=%s\n", val, tSet);        // 删除并返回最后一个元素        val = (String)tSet.pollLast();        System.out.printf("pollLast=%s, set=%s\n", val, tSet);        // 清空HashSet        tSet.clear();        // 输出HashSet是否为空        System.out.printf("%s\n", tSet.isEmpty()?"set is empty":"set is not empty");    }}

运行结果

TreeSet:[aaa, bbb, ccc, ddd, eee]size : 5floor bbb: bbblower bbb: aaaceiling bbb: bbbceiling eee: eeehigher bbb: cccsubSet(aaa, true, ccc, true): [aaa, bbb, ccc]subSet(aaa, true, ccc, false): [aaa, bbb]subSet(aaa, false, ccc, true): [bbb, ccc]subSet(aaa, false, ccc, false): [bbb]headSet(ccc, true): [aaa, bbb, ccc]headSet(ccc, false): [aaa, bbb]tailSet(ccc, true): [ccc, ddd, eee]tailSet(ccc, false): [ddd, eee]for each : aaafor each : bbbfor each : dddfor each : eeeTreeSet:[aaa, bbb, ddd, eee]iter : aaaiter : bbbiter : ddditer : eeepollFirst=aaa, set=[bbb, ddd, eee]pollLast=eee, set=[bbb, ddd]set is empty

转载于:https://my.oschina.net/jewill/blog/411855

你可能感兴趣的文章
通用数据压缩算法简介
查看>>
The next Industry Standard in IT Monitoring, a python implementation Nagios like tool --- Shinken
查看>>
(笔记)找工作,该怎么进补
查看>>
div的显示和隐藏以及点击图标的更改
查看>>
(轉貼) Ubuntu將在ARM平台netbook上現身 (SOC) (News) (Linux) (Ubuntu)
查看>>
SQL注入测试工具:Pangolin(穿山甲)
查看>>
在html 的img属性里只显示图片的部分区域(矩形,给出开始点和结束点),其他部份不显示,也不要拉伸...
查看>>
程序员第二定律:量化管理在程序员身上永无可能
查看>>
ubuntu一些脚本的执行顺序
查看>>
类继承的结构
查看>>
Intel 被 ARM 逼急了
查看>>
testng + reportng 测试结果邮件发送
查看>>
神操作:如何将Vim变成一个R语言IDE
查看>>
百度亮相iDASH,推动隐私保护在人类基因组分析领域的应用
查看>>
比特币暴涨拉升至1w美元以上,说比特币崩盘的专家要失望了
查看>>
Python「八宗罪」
查看>>
你的隐私还安全吗?社交网络中浏览历史的去匿名化
查看>>
NeurIPS 2018|如何用循环关系网络解决数独类关系推理任务?
查看>>
Windows 10 份额突破 40%,Windows 7 连跌四月终回升
查看>>
怎么把Maven项目转为动态Web项目?
查看>>