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 ...
随机推荐
- golang build 的简单用法.(菜鸟初学)
1. golang 里面的 go build 可以编译代码. go build helloworld.go 2. 这里面有一个注意事项事项. 如果引用非go语言的 内置package的话 需要在环境变 ...
- 快速用梯度下降法实现一个Logistic Regression 分类器
前阵子听说一个面试题:你实现一个logistic Regression需要多少分钟?搞数据挖掘的人都会觉得实现这个简单的分类器分分钟就搞定了吧? 因为我做数据挖掘的时候,从来都是顺手用用工具的,尤其是 ...
- ASP.NET Core 2 学习笔记
之前的ASP.NET网站,只要把*.html.*.css.*.jpg.*.png.*.js等静态文件放在项目根目录,默认都可以直接被浏览:但ASP.NET Core 小改了浏览静态文件的方式,默认根目 ...
- JAVA里面的“指针”
JAVA里面的“指针” 众所周知,在java里面是没有指针的.那为何此处还要说java里面的“指针”呢?我们知道在C/C++中,指针是指向内存中的地址.那么在Java里 ...
- bzoj1683[Usaco2005 Nov]City skyline 城市地平线
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1683 Input 第1行:2个用空格隔开的整数N和W. 第2到N+1行:每行包括2个用空格 ...
- BZOJ2276 [Poi2011]Temperature 【单调队列】
题目链接 BZOJ2276 题解 一开始看错题,以为求的是可以不连续的,想出一个奇怪的线段树,发现空间根本开不下?? 题目要我们求连续的最长可能不下降区间 对于区间\([l,r]\)如果合法,当且仅当 ...
- 【poj3133】 Manhattan Wiring
http://poj.org/problem?id=3133 (题目链接) 题意 $n*m$的网格里有空格和障碍,还有两个$2$和两个$3$.要求把这两个$2$和两个$3$各用一条折线连起来.障碍里不 ...
- [CQOI2016] 手机号码 (数位dp)
link $solution:$ $10^{10} \leq L \leq R < 10^{11}$这个数据范围很容易想到数位$dp$. 依照题意模拟即可. #include<iostre ...
- 【最小割/二分图最大独立集】【网络流24题】【P2774】 方格取数问题
Description 给定一个 \(n~\times~m\) 的矩阵,每个位置有一个正整数,选择一些互不相邻的数,最大化权值和 Limitation \(1~\leq~n,~m~\leq~100\) ...
- js正则取出一个字符串小括号中的内容
var aa="ldfjsldfj(dsfasjfj3124123)"; var result = aa.match(/\(([^)]*)\)/); // 此时result=[&q ...