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 ...
随机推荐
- vue-cli配置axios
1. npm install axios --save 2. npm install @type/axios --save-dev(使用ts编写的需要此声明文件,升级的axios好像不需要了,已经自带 ...
- p2 弹簧
P2中用来约束刚体运动的还有弹簧Spring. 弹簧除约束两个刚体之间的运动轨迹外,通过damping阻尼和stiffness刚度系数等属性,使得刚体在向目标移动时, 出现类似弹簧的简谐运动.Spri ...
- Day22-中间件
1.中间件,在其它程序中,有的叫管道,有的叫http handler.下面是原生的中间件 2.自己也可以写中间件 2.1 写中间件,新建文件夹Middle,新建m1.py 2.2 在setting里注 ...
- BGP的那些安全痛点(转)
0x00 BGP(RFC 1771. RFC 4271)定义 全称是Border Gateway Protocol, 对应中文是边界网关协议,最新版本是BGPv4. BGP是互联网上一个核心的互联网去 ...
- debian修改默认编辑器
刚才在一台机器上打开 crontab -e,跳出来的编辑器是nano,太难使... 在debian下是使用 update-alternatives 命令修改默认编辑器. 先查看一下使用帮助 # upd ...
- 基于excel导入数据到ms sql server
OLE DB (Object Linking and Embedding, Database, sometimes written as OLEDB or OLE-DB) an API designe ...
- bzoj 2178 自适应Simpson积分
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #i ...
- [USACO10OPEN]牛跳房子Cow Hopscotch
题目描述 奶牛们正在回味童年,玩一个类似跳格子的游戏,在这个游戏里,奶 牛们在草地上画了一行N个格子,(3 <=N <= 250,000),编号为1..N. 就像任何一个好游戏一样,这样的 ...
- 语法:c++对关于空指针0/NULL/nullptr三者的演变
来源: https://blog.csdn.net/u010558281/article/details/77793644 字面意义上的解释: 0:整型常量 NULL:预处理符号 nullptr:空指 ...
- P2042 [NOI2005]维护数列 && Splay区间操作(四)
到这里 \(A\) 了这题, \(Splay\) 就能算入好门了吧. 今天是个特殊的日子, \(NOI\) 出成绩, 大佬 \(Cu\) 不敢相信这一切这么快, 一下子机房就只剩我和 \(zrs\) ...