32、TreeSet简介
使用TreeSet存储Integer对象
TreeSet的特点是可以对存放进去的元素进行排序。
package com.sutaoyu.list;
import java.util.TreeSet;
public class list_test_18 {
public static void main(String[] args) {
TreeSet<Integer> ts = new TreeSet<>();
ts.add(3);
ts.add(3);
ts.add(3);
ts.add(1);
ts.add(1);
ts.add(2);
ts.add(4);
ts.add(5);
ts.add(7);
ts.add(6);
System.out.println(ts);
}
}
使用TreeSet存储自定义类型对象
这里还是存储之前定义的Person对象,需要实现Comparable接口并且重写compareTo方法,先根据name的字典顺序排序,然后再根据年龄进行排序。
package com.sutaoyu.TreeSet;
import java.util.TreeSet;
public class TreeSet_test_1 {
public static void main(String[] args) {
TreeSet<Person> ts = new TreeSet<>();
ts.add(new Person("tony",23));
ts.add(new Person("paul",20));
ts.add(new Person("andy",22));
ts.add(new Person("james",24));
ts.add(new Person("lucy",21));
System.out.println(ts);
}
}
测试类里面如果name写的是中文的话则不能进行汉语拼音排序,因为String类中重写的compareTo方法是根据char类型对应的ascii值进行排序的。
compareTo方法的返回值
TreeSet使用了二叉树的数据结构,负数放到左边,正数放到右边。
- 当compareTo方法返回0的时候,系统会认为两者一致,所以不会向集合中添加元素
- 当compareTo方法返回正数的时候,系统将元素存储到右边,所以集合存取顺序一致

- 当compareTo方法返回负数的时候,系统将元素存储到左边,所以集合会倒序存储
Comparator比较器
可以向TreeSet的构造方法中传入一个定制的Comparator,如果传入了Comparator的子类对象, 那么TreeSet就会按照传入对象中定制的规则排序。例如将Person中name按照长度排序。
定制一个CompareByNameLength类实现Comparator接口并重写compare方法,在方法里面编写排序规则
package com.monkey1024.set;
import java.util.Comparator;
import com.monkey1024.bean.Person;
public class CompareByNameLength implements Comparator<Person> {
@Override
public int compare(Person p1, Person p2) {
//根据name长度进行排序
int num = p1.getName().length() - p2.getName().length();
if(num == 0){
num = p1.getName().compareTo(p2.getName());
if(num == 0){
num = p1.getAge() - p2.getAge();
}
}
return num;
}
}
测试类,向TreeSet的构造方法中传入CompareByNameLength对象
package com.monkey1024.set; import java.util.TreeSet; import com.monkey1024.bean.Person; /**
* TreeSet可以对元素进行排序
* 使用TreeSet根据name长度进行排序
*
*/
public class TreeSetTest03 { public static void main(String[] args) {
TreeSet<Person> ts = new TreeSet<>(new CompareByNameLength());
ts.add(new Person("tony", 23));
ts.add(new Person("jordan", 20));
ts.add(new Person("tim", 22));
ts.add(new Person("james", 24));
ts.add(new Person("an", 21)); System.out.println(ts);
} }
练习:
1.将一个字符串中的字符按照字典顺序进行排序,要保留重复的字符。例如输入:java,打印aajv
答案:
1.向输入的字符串转换为字符数组,然后向TreeSet中添加字符
package com.monkey1024.set.exercise; import java.util.Comparator;
import java.util.Scanner;
import java.util.TreeSet; /**
* 问题:将一个字符串中的字符按照字典顺序进行排序,要保留重复的字符。例如输入:java,打印aajv
* 分析:向输入的字符串转换为字符数组,然后向TreeSet中添加字符
*/
public class Exercise03 { public static void main(String[] args) {
Scanner sc = new Scanner(System.in); //创建键盘录入对象
System.out.println("请输入一行字符串:");
String line = sc.nextLine(); //将键盘录入的字符串存储在line中
char[] arr = line.toCharArray(); //将字符串转换成字符数组
TreeSet<Character> ts = new TreeSet<>(new Comparator<Character>() { @Override
public int compare(Character c1, Character c2) {
int num = c1.compareTo(c2);
//保存重复数据
return num == 0 ? 1 : num;
}
}); for(char c : arr) {
ts.add(c);
} for(Character ch : ts) {
System.out.print(ch);
}
} }
32、TreeSet简介的更多相关文章
- Java集合--TreeSet
转载请注明出处:http://www.cnblogs.com/skywang12345/admin/EditPosts.aspx?postid=3311268 第1部分 TreeSet介绍 TreeS ...
- Java中TreeSet的详细用法
第1部分 TreeSet介绍 TreeSet简介 TreeSet 是一个有序的集合,它的作用是提供有序的Set集合.它继承于AbstractSet抽象类,实现了NavigableSet, Clonea ...
- JAVA中的TreeSet
TreeSet简介 TreeSet是一个有序的集合,它的作用是提供一个有序的Set集合,它继承于AbstractSet抽象类实现了NavigableSet<E>, Cloneable, j ...
- Java集合源码分析(六)TreeSet<E>
TreeSet简介 TreeSet 是一个有序的集合,它的作用是提供有序的Set集合.它继承于AbstractSet抽象类,实现了NavigableSet<E>, Cloneable, j ...
- Java 集合系列17之 TreeSet详细介绍(源码解析)和使用示例
概要 这一章,我们对TreeSet进行学习.我们先对TreeSet有个整体认识,然后再学习它的源码,最后再通过实例来学会使用TreeSet.内容包括:第1部分 TreeSet介绍第2部分 TreeSe ...
- 【Java入门提高篇】Day31 Java容器类详解(十三)TreeSet详解
上一篇很水的介绍完了TreeMap,这一篇来看看更水的TreeSet. 本文将从以下几个角度进行展开: 1.TreeSet简介和使用栗子 2.TreeSet源码分析 本篇大约需食用10分钟,各位看官请 ...
- (转)TreeSet简单介绍与使用方法
TreeSet简介 TreeSet是JAVA中集合的一种,TreeSet 是一个有序的集合,它的作用是提供有序的Set集合.它继承于AbstractSet抽象类,实现了NavigableSet< ...
- Set集合之TreeSet类
TreeSet简介 TreeSet是SortedSet接口的实现类,正如SortedSet名字所暗示的,TreeSet可以确保集合元素处于排序状态.与HashSet集合相比,TreeSet还提供了如下 ...
- Java特殊数据结构-TreeSet
资料来源 TreeSet初步入门总结 https://www.cnblogs.com/yzssoft/p/7127894.html TreeSet自然排序与比较器排序精讲 https://blog.c ...
随机推荐
- poj 3311(状态压缩DP)
poj 3311(状态压缩DP) 题意:一个人送披萨从原点出发,每次不超过10个地方,每个地方可以重复走,给出这些地方之间的时间,求送完披萨回到原点的最小时间. 解析:类似TSP问题,但是每个点可以 ...
- H5实现的时钟
源码如下: <!doctype html> <html> <head></head> <body> <canvas id=" ...
- Qt——结合qt和python
经常使用qt的童鞋一定有过这样的经历:百度或Google某个关于Qt的问题的时候,发现有的解答不是用的C++,而是包含很多py.__init__.self之类的词. 如果学过python,你会发现,这 ...
- BZOJ3158 千钧一发(最小割)
可以看做一些物品中某些互相排斥求最大价值.如果这是个二分图的话,就很容易用最小割了. 观察其给出的条件间是否有什么联系.如果两个数都是偶数,显然满足条件二:而若都是奇数,则满足条件一,因为式子列出来发 ...
- P4611 [COCI2011-2012#7] TRAMPOLIN
题目背景 有很多超级英雄:蝙蝠侠,蜘蛛侠,超人等.其中,有一位叫牛.今天他想模仿蜘蛛侠,所以他选择了一排高大的摩天楼来跳. 题目描述 具体而言,他选择了一个由 N 个摩天大楼构成的序 列,从左到右编号 ...
- Crawl(1)
爬贴吧小说. 爬取该链接中的楼主发言前10页另存为文本文件 python2.7 # *-* coding: UTF-8 *-* import urllib2 import re class BDTB: ...
- BZOJ2079 [Poi2010]Guilds 【贪心】
题目链接 BZOJ2079 题解 题意就是黑白染色,要求相邻点存在不同颜色的点 显然从一个点出发,相邻点如果没有染色,染不同颜色,那么一个联通块一定会满足要求 证明:在\(dfs\)树上,每个点父亲和 ...
- phpredis pipeline
通过pipeline方式将client端命令一起发出,redis server会处理完多条命令后,将结果一起打包返回client,从而节省大量的网络延迟开销.
- Android Studio 导入系统 jar包
1.当前需要导入系统jar包的module所对应build.gradle中添加如下依赖: provided files('libs/classes-full-debug.jar') 也可以图形化设置: ...
- Activity工作流(2)-入门安装运行第一个例子
转: Activity工作流(2)-入门安装运行第一个例子 置顶 2017年05月24日 15:58:50 li_ch_ch 阅读数:24432 版权声明:本文为博主原创文章,未经博主允许不得转载 ...