Java自定义Comparator实现复杂排序(什么情况返回-1?返回0?返回1?)

网友投稿 415 2022-08-23

Java自定义Comparator实现复杂排序(什么情况返回-1?返回0?返回1?)

一、什么情况返回-1?0?1?

Comparator接口的​​int compare(T o1, T o2);​​方法中,o1 和 o2的在排序前集合中的顺序为:o2在o1前面,首先要知道这一点。

以升序排序为例:

o1 < o2 时返回 -1;当o2 > o1 或 o2 = o1,返回0 或 1;

结论:

返回-1 表⽰交换o2 和 o1的顺序;返回0 和 1都表示不交换o2 和 o1的顺序;此外:当两个元素(o1 和 o2)相同时,不需要交换顺序,为了排序算法的稳定性,可以使用1来代替0,不要用-1来代替0。

PS:当前文章为Java排序算法源码分析的前置文章。

二、自定义Comparator

Java实现对象排序的方式有两种:

自然排序:java.lang.Comparable定制排序:java.util.Comparator

当我们想针对某个JavaBean做复杂排序就需要自定义Comparator,像String、Integer、Double等一些简单的对象都实现了​​java.lang.Comparable​​​接口,可以使用​​compareTo(Object obj)​​方法做简单的比较 / 排序。

自定义Comparator样例:

User对象中有两个属性:Integer类型的age(表示用户年龄)、String类型的name(表示用户名称);现在我想实现的排序规则:User对象先按照年龄升序排序,如果年龄相同,再按姓名字母顺序(不考虑大小写)升序排序;

package com.saint.sort;import java.util.*;/** * 当遇到一些复杂的场景时,我们需要自定义排序规则 * @author Saint */public class MyComparatorTest { public static void main(String[] args) { User user1 = new User("saint", 18); User user2 = new User("bob", 18); User user3 = new User("bibi", 19); User user4 = new User("beer", 19); List users = new ArrayList<>(); users.add(user1); users.add(user2); users.add(user3); users.add(user4); System.out.println("before sorting!"); users.stream().forEach(System.out::println); users.sort(new UserComparator()); System.out.println("----------------------"); System.out.println("after sorting!"); users.stream().forEach(System.out::println); }}class UserComparator implements Comparator { /** * User对象先按照年龄升序排序,如果年龄相同,再按姓名字母顺序(不考虑大小写)升序排序 *

* PS:o2 is in front of o1 in the unsorted collection * * @param o1 param one * @param o2 param two * @return */ @Override public int compare(User o1, User o2) { // 年龄升序排序 if (o1.getAge() < o2.getAge()) { return -1; } else if (o1.getAge() > o2.getAge()) { // 0的含义是在两个元素相同时,不交换顺序(为了排序算法的稳定性,可以使用1来代替0,不要用-1来代替0) return 0; } else { // 姓名升序排序(不考虑字母大小写) if (o1.getName().toLowerCase().compareTo(o2.getName().toLowerCase()) < 0) { return -1; } else { return 1; } } }}class User { private String name; private Integer age; public User(String name, Integer age) { this.name = name; this.age = age; } public String getName() { return name; } public Integer getAge() { return age; } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", age=" + age + '}'; }}

三、运行结果

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:如何把营销做到1+1远远大于2,如何运用这个“跨界营销”?(1+N营销)
下一篇:《SpringBoot启动流程一》:万字debug梳理SpringBoot如何加载并处理META-INF/spring.factories文件中的信息
相关文章

 发表评论

暂时没有评论,来抢沙发吧~