首页 > 编程知识 正文

java排序函数,java的集合体系

时间:2023-05-06 19:46:08 阅读:111381 作者:3872

TreeSet是实现Set接口的实现类。 因此,存储的值是唯一的,同时也可以对存储的值进行排序。 排序时使用二叉树原理。 所以要理解这个班,首先要简单地理解什么是二叉树。

二叉树原理综述

如果有这样的集合TreeSet的话[ 5,11,6,5,23,14 ]

用二叉树怎么排序?

二叉树的遍历方法很多,感兴趣的话在百度上看看吧。 在这里,你只需要知道元素是如何插入二叉树的。 小的存储在左边(负数),大的存储在右边(正数),不相等。

TreeSet的基本使用

publicstaticvoidmain (字符串[ ] args ) {

TreeSet ts=new TreeSet (;

ts.add(2;

ts.add(1;

ts.add(3;

ts.add(2;

ts.add(3;

ts.add(1;

ts.add(2;

system.out.println(ts;

//输出结果:

[ 1,2,3 ]

可以看到,TreeSet集合不仅保证了集合元素的唯一性,而且还可以进行排序。

如果TreeSet中存储了对象呢? 会怎么样呢?

publicstaticvoidmain (字符串[ ] args ) {

TreeSet ts=new TreeSet (;

ts.add(newstudents ) )疏忽的睫毛膏)、13 );

ts.add(newstudents )“快乐信封”,14 );

ts.add(newstudents(DPdhb ),15 );

system.out.println(ts;

//输出结果:

exceptioninthread ' main ' Java.lang.classcastexception 3360 com.lei.studentscannotbecastojava.lang.com parable

错了。 集合中包含对象,因此无法将对象转换为可比较的对象。

如果想按照年龄顺序打印各个对象,该怎么办?

在API中搜索Comparable后,发现是界面。 您可以让Students类别实作Comparable介面方法,让Students物件成为可比较的物件。

Students类实现Comparable接口方法。

publicclassstudentsimplementscomparable { privatestring name; 私有增量;

.

@ overridepublicintcompareto (studentso ) {return this.age-o.age;

}

}

为什么是this.age-o.age? this.age表示调用时对象的age,如果返回的是正数(大于o.age ),则存储在右边。 如果返回的是负数(小于o.age ),则存储在左侧。 0表示不保存。

这是个问题。 如果两个人是不同的名字,年龄相同,this.age - o.age=0的话,不是就不进二叉树了吗?

验证一下:

publicstaticvoidmain (字符串[ ] args ) {

TreeSet ts=new TreeSet (;

ts.add(newstudents )“快乐信封”,14 );

ts.add(newstudents ) )疏忽的睫毛膏)、13 );

ts.add(newstudents(DPdhb ),15 );

ts.add(newstudents(ssDBD ),13 );

system.out.println(ts;

//输出结果只有疏忽的睫毛膏、快乐的信封、dpdhb

所以,有必要改善Students系的compareTo方法,保证相同的年龄,但是不同名字的学生也可以加入二叉树。

@ overridepublicintcompareto (studentso ) {int num=this.age -o.age; //String类中的compareTo方法//int compare to (stringanotherstring )被重写为按词典顺序比较两个字符串

返回编号==0? this.name.comPareto(o.name ) : num;

这样就可以保存四个不同的对象,按年龄排序,按字符串对年龄相同的对象进行排序。

除了可以用这种方法排序外,还有一种方法可以排序。

TreeSet提供了以下构建方法:

treeset (comparatorsuperecomparator )创建新的空树集,并根据指定的比较器对其进行排序。

Comparator是什么? 查看API文档:

Interface Comparator是包含要实现的接口方法的接口。

intcompare(to1,T o2 )比较这两个参数的顺序。

例如,对字符串的长度进行排序,对同样长度的安装字符串进行排序。

public class test5{ publicstaticvoidmain (string [ ] args ) }

treeset ts=new treeset (newsortedbylen (); //父类引用是子类对象Comparator c=new SortedByLen (;

ts.add(aaaaaaaaa );

ts.add(WC );

ts.add(NBA );

ts.add(CBA );

ts.add(chichung );

system.out.println(ts;

}

} classsortedbylenimplementscomparator {

@ overridepublicintcompare (stringo 1,String o2 ) ) {int num=o1.length )-o2.length ); 返回编号==0? O1.comPareto(O2 ) : num;

}

//输出结果:

[wc,cba,nba,chichung,aaaaaaaaa]

需要注意的是重写compare方法的o1、o2。 o1表示要调用的对象,o2表示集合中的对象。

两种实现排序方法根据情况使用。

(1)自然顺序(Comparable ) ) )。

TreeSet类的add ) )方法将保存的对象提升为Comparable类型

将调用对象的compareTo ()方法与集合中的对象进行比较

compareTo ) )基于从方法返回的结果进行保存

(2)比较器顺序(Comparator ) ) ) ) )。

可以在创建TreeSet时指定Comparator

如果传递了Comparator子类的对象,则TreeSet将按比较器中的顺序排序

的对象是compare方法的第一个参数,集合中的对象是compare方法的第二个参数

)3)两种方式的不同

不传递任何TreeSet构造函数,缺省情况下为类中的Comparable。 (如果没有,则将ClassCastException报告为错误。 )

TreeSet在传递给Comparator后,优先遵循Comparator

如果不想保证元素的唯一性,只需更改compare方法即可,绝对不要将其还原为0。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。