treeset根据什么排序,java中的treeset
写爬虫互联网协议(互联网协议)被封了怎么解决?立即使用
TreeSet与Java自定义类型的排序
演示合框架对线是可排序的合框架无法对自定义类型进行排序比较规则怎么写自平衡二叉树结构实现比较器接口收集工具类(免费学习推荐:java基础教程)
演示TreeSet对String是可排序的
1.树形图集合底层实际上是一个树形图
2.树形图集合底层是一个二叉树
3.放到合框架集合中的元素,等同于放到树形图集合键部分了
4.合框架集合中的元素,无序不可重复,但是可以按照元素的大小顺序自动排序称为:可排序集合
例如:编写程序从数据库中取出数据,在页面展示用户信息的时候按照生日升序或者降序,
这个时候可以使用合框架集合,因为合框架集合放进去,拿出来就是有序的。
//创建一个合框架集合
TreeSetString ts=new TreeSet();
//添加Stringts.add(张三);ts。add( Lisi );ts.add(吴王);ts.add(张思);ts.add(刘王);对于(字符串s:ts){
//按照字典顺序排序
系统。出去。打印“”);
}
TreeSet integer ts2=new TreeSet();ts2。添加(100);ts2。添加(200);ts2。添加(900);ts2。添加(800);ts2。添加(600);ts2。增加(10);对于(整数i:ts2){
//按照升序排序
系统。出去。打印(I );}
TreeSet无法对自定义类型进行排序
合框架可以对自定义类型进行排序?以下程序中,对于Person类来说,无法排序,因为没有指定Person对象之间的比较规则。谁大谁小并没有说明。
公共类TreeSetTest02 {
公共静态void main(String[] args) {
人p1=新人(50);
人p2=新人(10);
人p3=新人(20);
人p4=新人(60);
人p5=新人(40);
人p6=新人(30);
TreeSetPerson persons=new TreeSet();
人。添加(P1);
人。添加(p2);
人。添加(P3);
人。添加(P4);
人。添加(P5);
人。添加(P6);
对于(人p:人){
系统。出去。println(p);
}
} }类人{
年龄
公众人物(年龄间){
this.age=年龄;
}
@覆盖
公共字符串toString() {
返回" Person[age= age ]";
} }线程“主”Java。郎。抛出中出现异常:testCollection .人不能转换为可比较的出现这个错误的原因是Person类没有实现java.lang,Comparable接口
//放在合框架集合中的元素需要实现可比较的接口
//并且实现比较方法,等于可以不写
公共类TreeSetTest04 {
公共静态void main(String[] args) {
客户p1=新客户(50);
客户p2=新客户(10);
客户p3=新客户(20);
客户p4=新客户(60);
客户p5=新客户(40);
客户p6=新客户(30);
TreeSet customer customers=new TreeSet();
顾客。添加(P1);
顾客。添加(p2);
顾客。添加(P3);
顾客。添加(P4);
顾客。添加(P5);
顾客。添加(P6);
对于(客户p:客户){
系统。出去。println(p);
}
}
}
//放在合框架集合中的元素需要实现可比较的接口//并且实现比较方法,等于可以不写
类别客户实现可比客户{
年龄
公共客户(账龄){
this.age=年龄;
}
@覆盖
公共字符串toString() {
返回"客户[年龄=年龄]";
}
//需要在这个方法中编写比较的逻辑,或者说比较的规则,按照什么进行比较。
//k.compareTo(t.key)
//拿着参数k和集合中的每个k进行比较,返回值可能是0,0,=0
//比较规则最终还是程序员实现的:例如按照年龄升序,或者按照年龄降序
@覆盖
public int compare to(客户c){//C1。比较对象(C2)//TODO自动生成的方法存根
//这个是c1
//c是c2
//c1和c2进行比较的时候,就是这和c比较//int age 1=this。年龄;//int age 2=c . age;//if(age1==age2){//返回0;//}else if(age1age2){//返回1;//} else {//return-1;//}
返回这个。年龄-c .年龄;//,=
}
}//需要在这个方法中编写比较的逻辑,或者说比较的规则,按照什么进行比较。
//k.compareTo(t.key)
//拿着参数k和集合中的每个k进行比较,返回值可能是0,0,=0
//比较规则最终还是程序员实现的:例如按照年龄升序,或者按照年龄降序
比较规则怎么写
先按照年龄升序,如果年龄一样的再按照姓名升序
公共类TreeSetTest05 {
公共静态void main(String[] args) {
TreeSet VIP VIPs=new TreeSet();
vips.add(新Vip(张思,20));
vips.add(新Vip(张三,20));
vips.add(新Vip(国王,18));
vips.add(新Vip(软,17));
对于(Vip Vip:Vip){
系统。出去。println(VIP);
}
} }类贵宾实现可比Vip{
字符串名称;
年龄
公共Vip(字符串名称,整数){
this.name=name
this.age=年龄;
}
@覆盖
公共字符串toString() {
返回Vip [name= name ,age= age ];
}
//compareTo方法的返回值很重要:
//返回0表示相同,值会覆盖
//0,会继续在右子树上找
//0,会继续在左子树上找
@覆盖
公共国际比较(贵宾五){
如果年龄;年龄
//年龄相同时,按照名字排序
//姓名是线类型,可以直接比,调用比较方法
返回这个。姓名。比较到(v . name);
}否则{
//年龄不一样
返回这个。年龄-年龄;
}
}}自平衡二叉树结构
1.自平衡二叉树,遵循左小右大的原则存放
2.遍历二叉树的时候有三种方式
前序遍历:根左右
中序遍历:左根右
后序遍历:左右根
注意:前中后说的是根的位置
3.TreeSet集合和TreeMap集合采用的是中序遍历方式,即左根右。他们是自平衡二叉树
100 200 50 60 80 120 140 130 135 180 666
实现比较器接口
合框架集合中元素可排序的第二种方式,使用比较器的方式
公共类TreeSetTest06 {
公共静态void main(String[] args) {
//创建合框架集合的时候,需要使用比较器
//TreeSet Wu GUI Wu GUI=new TreeSet();//这样不行,没有通过构造方法传递一个比较器进去
TreeSet Wu GUI Wu GUIs=new TreeSet(new Wu guicomparator());
wuGuis.add(新吴贵(1000));
wuGuis.add(新吴贵(800));
wuGuis.add(新吴贵(900));
wuGuis.add(新吴贵(300));
wuGuis.add(新吴贵(60));
对于(无鬼无鬼:无鬼){
系统。出去。println(吴贵);
}
} }类无规{
年龄
公共物归(整数){
super();
this.age=年龄;
}
@覆盖
公共字符串toString() {
返回“吴贵[age= age ]”;
}}//单独再这里编写一个比较器//比较器实现java.util。比较器接口(可比是java。郎包下的)类乌龟比较器实现ComparatorWugui{
公共(同Internationalorganizations)国际组织比较(乌龟o1,乌龟o2){
//指定比较规则
//按照年龄排序
返回O1。年龄-氧气。年龄;
}}我们可以使用匿名内部类的方式
可以使用匿名内部类的方式(这个类没有名字,直接新的接口)
TreeSet Wu GUI Wu GUI=new TreeSet(new comparator Wu GUI(){ public int compare(Wu GUI O1,Wugui o2){
//指定比较规则
//按照年龄排序
返回O1。年龄-氧气。年龄;
}});最终的结论,放在合框架或者树形图集合键部分的元素要想做到排序,包括两种方式第一种:放在集合中的元素实现可比较的接口
第二种:在构造合框架或者树形图集合的时候给它传一个比较器对象。
可比较的和比较仪怎么选择呢?当比较规则不会发生改变的时候,或者说当比较规则只有1个的时候,建议实现Comparable接口如果比较规则有多个,并且需要多个比较规则之间频繁切换,建议使用comparator接口comparator接口的设计符合OCP原则。
Collections工具类
java.util.Collections集合工具类,方便集合的操作
公共类集合测试{
静态类乌龟2号实现可比Wugui2{
年龄
公共乌龟2(整数){
super();
this.age=年龄;
}
@覆盖
公共字符串toString() {
返回“吴贵2[age= age ]”;
}
@覆盖
公共int compareTo(Wugui2 o) {
//TODO自动生成的方法存根
返回这个。年龄-o .年龄;
}
}
公共静态void main(String[] args) {
//ArrayList集合不是线程安全的
ListString list=new ArrayList string();
//变成线程安全的
收藏。同步列表(list);
//排序
列表。添加( ABC );
列表。add( Abe );
列表。add( Abd );
列表。add( abf );
列表。添加( ABN );
列表。添加( abm );
收藏。排序(列表);
for(String s:list){
系统。出去。println(s);
}
list Wu GUI 2 Wu GUI=new ArrayList();
wuguis.add(新吴贵2(1000));
wuguis.add(新吴贵2(8000));
wuguis.add(新吴贵2(4000));
wuguis.add(新吴贵2(6000));
//注意:对目录集合中元素排序,需要保证目录集合中元素实现了可比较的接口
收藏。排序(吴贵斯);
for(Wugui2 wugui:wuguis){
系统。出去。println(吴贵);
}
//对设置集合怎么排序呢
SetString set=new HashSet();
设置。添加(国王);
set.add(金山词霸);
设置。添加(‘王者2’);
设置。添加(国王1 );
//将设置集合转换成目录集合
ListString my list=new ArrayList(set);
收藏。排序(我的列表);
for(String s:myList){
系统。出去。println(s);
}
//这种方式也可以排序
//Collections.sort(list集合,比较器对象)
}}
以上就是爪哇基础之合框架与爪哇自定义类型的排序的详细内容,更多请关注我们其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。