实现自然排序 java.lang.Comparable 接口,重写compareTo() 方法
public class A implements Comparable<A>{
/**
* @param o
* @return 如果结果是正数 就是升序,如果是负数 就是倒序 ,如果结果是 0 那么就认为相同,不排序
* 对于结果 换个角度思考,this在前 就是升序,this在后 就是降序
*/
@Override
public int compareTo(T t) {
return 0;
}
}
注意:
当我们添加元素到容器的时候,如果使用的不允许重复的集合例如 TreeSet,在实现Comparable的时候 如果 我们写的条件过少,就会导致compareTo 返回值 = 0,我们的集合就会默认这个元素相同,导致无法添加到集合!
案例演示
是先按照年龄升序,如果年龄相同,就按照姓名(中文转成拼音)进行升序
@Override
public int compareTo(Student o) {
int num = this.age - o.age;
/**
package com.zanglikun.domain;
public class Student implements Comparable<Student>{
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "persion{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
/**
*
* @param o
* @return 如果结果是正数 就是升序,如果是负数 就是倒序 ,如果结果是 0 那么就认为相同,不排序
* 对于结果 换个角度思考,this在前 就剩升序,this在后 就是降序
*/
@Override
public int compareTo(Student o) {
int num = this.age - o.age;
/**
* String.compareTo()的返回值是整型,它是按照顺序字母比较大小,并返回两者ASCII差值
*/
int num2 = num==0?this.name.compareTo(o.name):num;
return num2;
}
}
Test2
@Test
public void test002(){
TreeSet<Student> list = new TreeSet<>();
list.add(new Student("张大",30));
list.add(new Student("张二",10));
list.add(new Student("张三",40));
list.add(new Student("赵四",30));
list.add(new Student("赵四",80));
list.forEach(x ->{
System.out.println(x);
});
}
结果
解释:张 zhang ,赵 zhao 在ASCII 码中 o 大于 n 所以 当年龄都是30的时候 按照升序的话 赵四 排在 张大后面
比较器排序 java.util.Comparator
在创建集合的时候,我们在指定泛型的时候,可以额外追加 排序规则 即 比较器排序,代码如下:o1 > o2 是升序
@Test
public void test001() {
TreeSet<Persion> list = new TreeSet<>(new Comparator<Persion>() {
@Override
public int compare(Persion o1, Persion o2) {
int num = o1.getAge() - o2.getAge();
/**
* String.compareTo()的返回值是整型,它是按照顺序字母比较大小,并返回两者ASCII差值
*/
int num2 = num == 0 ? o1.getName().compareTo(o2.getName()) : num;
return num2;
}
});
list.add(new Persion("张大", 30));
list.add(new Persion("张二", 10));
list.add(new Persion("张三", 40));
list.add(new Persion("赵四", 30));
list.add(new Persion("赵四", 80));
list.stream().forEach(x -> {
System.out.println(x);
});
}
结果:
OK!
如果你需要使用Stream的方式实现排序,请跳转本站:https://www.zanglikun.com/14041.html
特殊说明:
上述文章均是作者实际操作后产出。烦请各位,请勿直接盗用!转载记得标注原文链接:www.zanglikun.com
第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取最新全部资料 ❤
第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取最新全部资料 ❤
评论(0)