0
点赞
收藏
分享

微信扫一扫

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实现对象排序的方式有两种:

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

当我们想针对某个JavaBean做复杂排序就需要自定义Comparator,像String、Integer、Double等一些简单的对象都实现了​​java.lang.Comparable<T>​​​接口,可以使用​​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<User> 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> {

/**
* User对象先按照年龄升序排序,如果年龄相同,再按姓名字母顺序(不考虑大小写)升序排序
* <p>
* 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 +
'}';
}
}

三、运行结果

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


举报

相关推荐

0 条评论