当前位置:   article > 正文

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

java 排序 0 -1 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 +
                '}';
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86

三、运行结果

在这里插入图片描述

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/355117
推荐阅读
相关标签
  

闽ICP备14008679号