第一种,可以实现边添加边排序,需要用到TreeSet。

第二种,用数组存放对象们,但是不需单独取出某属性排列好再重存,而是在原数组上用比较器重新排一次序。需要用到Arrays.sort(arr,comparator)。

第三种,用集合类中的list的子类存放对象们,然后排序。需要用到Collections.sort(list,comparator)。

java常用类实现Comparable接口,并提供了比较大小的标准。实现Comparable接口的常用类:

BigDecimal、BigIneger以及所有数值型对应包装类:按它们对应的数值的大小进行比较。

Character:按字符的UNICODE值进行比较。

Boolean:true对应的包装类实例大于false对应的包装类实例。

String:按字符串中字符的UNICODE值进行比较。

Date、Time:后面的时间、日期比前面的时间、日期大。

一般默认排序是升序,也就是自然排序

1.TreeSet排序:

/*

* TreeSet存储对象的时候, 可以排序, 但是需要指定排序的算法

*

* Integer能排序(有默认顺序), String能排序(有默认顺序), 自定义的类存储的时候出现异常(没有顺序)

*

* 如果想把自定义类的对象存入TreeSet进行排序, 那么必须实现Comparable接口

*   在类上implement Comparable

*   重写compareTo()方法

*   在方法内定义比较算法, 根据大小关系, 返回正数负数或零

*   在使用TreeSet存储对象的时候, add()方法内部就会自动调用compareTo()方法进行比较, 根据比较结果使用二叉树形式进行存储

*/

2.TreeSet是依靠TreeMap来实现的。

TreeSet是一个有序集合,TreeSet中的元素将按照升序排列,缺省是按照自然排序进行排列. 基本封装类型以及实现了Comparable接口,可以直接添加排序。如Integer, String类型

1 importjava.util.Iterator;2 import java.util.*;3

4 public classTreeSetTest {5 public static voidmain(String[] args) {6 Set ts = newTreeSet();7 ts.add("abc");8 ts.add("xyz");9 ts.add("rst");10 Iterator it =ts.iterator();11 while(it.hasNext()) {12 System.out.println(it.next());13 }14 }15 }

输出结果:

abc

rst

xyz

打印结果不是和先前加入的顺序一样,它是按照一个字母的排序法进行排序的。这是因为String 类实现了Comparable接口。

By default, String object (name) in TreeSet will be displayed in ascending order. if you want them displayed in descending order, you just need to

You just need to instantiate the TreeSet with

1 new TreeSet<>(Collections.reverseOrder());

This is a Comparator which reverses the natural order of the objects.

2.TreeSet对自定义对象的排序

2.1 使用TreeSet()构造方法,并对需要添加到set集合中的元素实现Comparable接口进行排序;

如果我们自己定义的一个类的对象要加入到TreeSet当中,那么这个类必须要实现Comparable接口。

1 packagetest.treeset;2 importjava.util.Iterator;3 importjava.util.Set;4 importjava.util.TreeSet;5

6

7 public classtest_treeset {8 @SuppressWarnings("unchecked")9 public static voidmain(String[] args) {10 Set ts = newTreeSet();11 ts.add(new Teacher("zhangsan", 1));12 ts.add(new Teacher("lisi", 2));13 ts.add(new Teacher("wangmazi", 3));14 ts.add(new Teacher("wangwu",4));15 ts.add(new Teacher("mazi", 3));16 Iterator it =ts.iterator();17 while(it.hasNext()) {18 System.out.println(it.next());19 }20 }21 }22 class Teacher implementsComparable {23 intnum;24 String name;25

26 Teacher(String name, intnum) {27 this.num =num;28 this.name =name;29 }30

31 publicString toString() {32 return "学号:" + num + "\t\t姓名:" +name;33 }34

35 //o中存放时的红黑二叉树中的节点,从根节点开始比较

36 public intcompareTo(Object o) {37 Teacher ss =(Teacher) o;38 int result = num < ss.num ? 1 : (num == ss.num ? 0 : -1);//降序39 //int result = num > ss.num ? 1 : (num == ss.num ? 0 : -1);//升序

40 if (result == 0) {41 result =name.compareTo(ss.name);42 }43 returnresult;44 }45 }

运行结果:

学号:4 姓名:wangwu

学号:3姓名:mazi

学号:3姓名:wangmazi

学号:2姓名:lisi

学号:1姓名:zhangsan

2.2. 通过TreeSet(Comparator super E> comparator) 构造方法指定TreeSet的比较器进行排序;

在使用Arrays对数组中的元素进行排序的时候,可以传递一个比较器。

在使用Collections对集合中的元素进行排序的时候,可以传递一个比较器。

那么在使用TreeSet对加入到其中的元素进行排序的时候可以传入一个比较器吗?

1 public TreeSet(Comparator super E>comparator) {2 this(new TreeMap(comparator));3 }

通过查看它的构造方法就知道可以传入一个比较器。

构造一个新的空TreeSet,它根据指定比较器进行排序。插入到该 set 的所有元素都必须能够由指定比较器进行相互比较:对于 set 中的任意两个元素 e1 和e2,执行 comparator.compare(e1, e2) 都不得抛出 ClassCastException。如果用户试图将违反此约束的元素添加到 set 中,则 add 调用将抛出 ClassCastException。

1 packagetest.treeset;2

3 importjava.util.Comparator;4 importjava.util.Iterator;5 importjava.util.TreeSet;6

7 public classTreeSetTest {8 @SuppressWarnings("unchecked")9 public static voidmain(String[] args) {10 TreeSet ts = new TreeSet(newTeacher2.TeacherCompare());11 ts.add(new Teacher2("zhangsan", 2));12 ts.add(new Teacher2("lisi", 1));13 ts.add(new Teacher2("wangmazi", 3));14 ts.add(new Teacher2("mazi", 3));15 Iterator it =ts.iterator();16 while(it.hasNext()) {17 System.out.println(it.next());18 }19 }20 }21

22 classTeacher2 {23 intnum;24 String name;25

26 Teacher2(String name, intnum) {27 this.num =num;28 this.name =name;29 }30

31 publicString toString() {32 return "学号:" + num + " 姓名:" +name;33 }34

35 static class TeacherCompare implements Comparator {//老师自带的一个比较器36 //o1中存放的事目标节点37 //o2中存放时的红黑二叉树中的节点,从根节点开始比较

38 public intcompare(Object o1, Object o2) {39 Teacher2 s1 = (Teacher2) o1;//转型

40 Teacher2 s2 = (Teacher2) o2;//转型

41 int result = s1.num > s2.num ? 1 : (s1.num == s2.num ? 0 : -1);42 if (result == 0) {43 result =s1.name.compareTo(s2.name);44 }45 returnresult;46 }47

48 }49

50 }

运行结果:

学号:1 姓名:lisi

学号:2 姓名:zhangsan

学号:3 姓名:mazi

学号:3 姓名:wangmazi

二、用数组存放对象,用比较器改变sort()排序方法。

数组本身有默认的排序方法,针对int、string等基本类型有默认的sort()方法。而针对类对象的排序,可以给sort()方法传进一个比较器对象,赋予其排序的算法。

1 public classArraysTest {2

3 public static voidmain(String[] args) {4 Person[] people = new Person[5];5 people[0] = (new Person("小明", 20));6 people[1] = (new Person("小张", 30));7 people[2] = (new Person("小刘", 18));8 people[3] = (new Person("小林", 17));9 people[4] = (new Person("小刘", 35));10

11 Arrays.sort(people, new MyCompare());//传进来一个比较器对象,使数组按比较器定义的规则来排序

12 for(Person i : people) {13 System.out.println(i);14 }15 }16 }17

18 classPerson {19 String name;20 intage;21 publicPerson() {}22

23 public Person(String name, intage) {24 this.name =name;25 this.age =age;26 }27

28 publicString toString() {29 return "姓名:" + name + ",年龄:" +age;30 }31 }32

33 class MyCompare implements Comparator {//定义比较器

34 /*

35 *36 * 重写比较方法compare(o1,o2):37 * 方法传进来两个对象,用两个对象的某属性进行对比,返回一个int。38 * int>0,则o1排在o2后面;39 * int<0,则o1排在o2前面;40 * int=0,则维持原相对位置,即原来存放时o1、o2的前后地址顺序。 *41 */

42 public intcompare(Person o1, Person o2) {43 intresult;44 if (o1.age >o2.age) {45 result = 1;46 } else if (o1.age

第三种:用list的子类:Vector、ArrayList存放对象们,调用Collections.sort(list,comparator)方法进行排序。

1 public classCollectionsTest {2

3 public static voidmain(String[] args) {4 Vector people = new Vector<>();//用向量保存对象5 //ArrayList people=new ArrayList<>()://用ArrayList保存对象。

6 people.add(new Person("小明", 20));7 people.add(new Person("小张", 30));8 people.add(new Person("小刘", 18));9 people.add(new Person("小林", 17));10 people.add(new Person("小刘", 35));11 Collections.sort(people, new MyComparator());//调用方法进行排序

12 Iterator it =people.iterator();13 while(it.hasNext()) {14 System.out.println(it.next());15 }16 }17 }18

19 classPerson {20 String name;21 intage;22

23 publicPerson() {}24

25 public Person(String name, intage) {26 this.name =name;27 this.age =age;28 }29

30 publicString toString() {31 return "姓名:" + name + ",年龄:" +age;32 }33

34 }35

36 class MyComparator implements Comparator {//实现Comparator接口,自定义比较器,实现compare方法定义比较算法

37 /*

38 * compare(o1,o2):方法传进两个对象,根据某属性进行比较,返回一个int值。 int>0,o1排在o2后; int<0,o1排在o2前;39 * int=0,维持原来存放时的相对位置。40 *41 */

42 public intcompare(Person p1, Person p2) {43 int result = p1.age < p2.age ? 1 : (p1.age == p2.age ? 0 : -1);//降序排列44 //int result=p1.age

45

46 if (result == 0) {47 result =p1.name.compareTo(p2.name);48 }49 returnresult;50 }51 }

通过匿名比较器进行排序

1 public static List sortAsFloat(List list, final booleanreverseOrder) {2 Collections.sort(list, new Comparator(){3

4 public intcompare(String o1, String o2) {5 if(reverseOrder) {6 return (int) (Float.parseFloat(o2) -Float.parseFloat(o1));7 } else{8 return (int) (Float.parseFloat(o1) -Float.parseFloat(o2));9 }10 }11 });12

13 returnlist;14 }

java给xyz大小排序_Java Collection - 002 排序相关推荐

  1. java给xyz大小排序_java实现递归实现string xyz排序

    先用上面的一张图说明逻辑,这就是递归的逻辑. xy排序就相当于在x的空位插上y,x只有两个空位,y插前面得带yx,y插后面得到xy xyz排序就相当于在xy排序的所有结果插上z,结果如图 代码实现如下 ...

  2. java给xyz大小排序_java递归实现string xyz排序

    先用上面的一张图说明逻辑,这就是递归的逻辑. xy排序就相当于在x的空位插上y,x只有两个空位,y插前面得带yx,y插后面得到xy xyz排序就相当于在xy排序的所有结果插上z,结果如图 代码实现如下 ...

  3. java大string排序_java中字符串排序,String 转化为int比较大小

    引入题目 题目描述 设有nnn个正整数(n≤20)(n≤20)(n≤20),将它们联接成一排,组成一个最大的多位整数. 例如:n=3时,3个整数13,312,343联接成的最大整数为:34331213 ...

  4. java系统排序_Java实现二进制排序树

    在计算机科学中,树是非常重要的数据结构二叉排序树是树的一种特殊情况二叉排序树是,它的每个节点只能有两个子节点,左子树的节点小于其父节点,右子树中的节点大于其父节点. 父节点二进制排序树在搜索中使用非常 ...

  5. java collections.sort 忽略大小写排序_Java Spring Mongo排序忽略大小写问题

    我正在使用Spring-Data-mongodb对MongoDB执行各种请求. 尝试执行分页&时用忽略的情况排序我得到一个例外, 这是我的代码: Sort.Order order = new ...

  6. java treeset排序_java TreeSet的排序之自然排序

    TreeSet会调用元素的compareTo(Object o)方法来比较元素之间的大小关系,然后将集合里的元素按升序排列.此时需要排序元素的类必须实现Compareble接口,并覆写其int com ...

  7. java中集合的排序_Java中集合排序的两种方法

    import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.u ...

  8. java数组按照大小排列_Java怎么让数组中元素按照牌值从小到大的顺序排列

    展开全部 你说的这些牌是用数组来存放的,所以有些麻烦.直接复制运行,更改牌的62616964757a686964616fe58685e5aeb931333332643838数量测试,有不懂的再问我pa ...

  9. java怎么给list集合排序_java list集合排序按某一属性排序操作

    我就废话不多说了,大家还是直接看代码吧~ public List sortList(List list){ Collections.sort(list, new Comparator(){ @Over ...

  10. java bitmap 排序_Java实现2-BitMap排序

    2-BitMap算法是BitMap算法的一种扩展,核心是:每个数分配2个bit,00表示不存在,01表示出现一次,10表示出现2次,11表示多次或无意义. 一个int类型,占4个字节,在2-BitMa ...

最新文章

  1. WebStorm 打开多个项目的方法
  2. 19倍超音速“大炮”轰出可控核聚变!成本仅为传统方法0.1%,腾讯已投资
  3. python从入门到精通视频教程百度云-python从入门到精通视频教程百度云资源
  4. 记一次线上Java程序导致服务器CPU占用率过高的问题排除过程
  5. 拥抱开源, Office 365开发迎来新时代
  6. java aop 实例_Spring aop 简单示例
  7. 使用Spring的Hibernate构建Java Web应用程序
  8. ffmpeg优化mp4以及hls参数设置
  9. SEO人生衔接后用户可随时随地同他的合作伙伴协同工作
  10. Java依赖注入 - DI设计模式示例教程
  11. oracle++dtcol,Oracle 中的 Incarnation 到底是个什么?实验操作篇
  12. java 鼠标拖动_java 让表项支持鼠标拖动移位,并自动滚动滚动条
  13. 打分现场流程策划及排练大致流程-仅参考
  14. 目录:软件评测师教程
  15. VISIO2003基本形状
  16. imp执行错误IMP-00010
  17. ArcGIS Pro 创建tpk
  18. Java面向对象之创建和使用对象——定义学生/教师类并输出相关信息
  19. 北邮计算机周安福,周安福
  20. VLC Plugin JS 方法

热门文章

  1. Julia:从交易流水动态计算可用资金
  2. 菜鸟的系统架构师如何应对交易系统激增的系统流量
  3. 机器学习笔记(十):梯度下降 | 凌云时刻
  4. 【优化覆盖】基于matlab粒子群算法求解传感器覆盖优化问题【含Matlab源码 1493期】
  5. 【优化算法】蝠鲼觅食优化算法(MRFO)【含Matlab源码 1435期】
  6. 【TWVRP】基于matlab节约算法求解带时间窗的电动车路径规划问题【含Matlab源码 1169期】
  7. 【肌电信号】基于matlab GUI脉搏信号脉率存档【含Matlab源码 237期】
  8. 史秀峰计算机网络技术与应用第二版,史秀峰版《计算机网络技术与应用》期中测试.doc...
  9. 深度学习将灰度图着色_使用DeOldify着色和还原灰度图像和视频
  10. ai人工智能_AI破坏已经开始