Comparable与Comparator

发布时间 2023-04-03 00:39:34作者: 大意了没有闪

实现Comparable接口

@Test
void f1() {
    @Data
    @AllArgsConstructor
    class Student implements Comparable<Student> {
        int no;
        String name;

        @Override
        public int compareTo(Student o) {
            return no - o.no;
        }
    }

    Student[] arr = {new Student(3, "zs"), new Student(1, "lisi"), new Student(2, "ww")};
    Arrays.sort(arr);
    System.out.println(Arrays.toString(arr));
}

// 输出:
[Student(no=1, name=lisi), Student(no=2, name=ww), Student(no=3, name=zs)]

使用Comparator比较器

如果类没有实现接口,可以选择这种方式进行比较

@Test
void f1() {
    @Data
    @AllArgsConstructor
    class Student{
        int no;
        String name;
    }

    Student[] arr = {new Student(3, "zs"), new Student(1, "lisi"), new Student(2, "ww")};
    Arrays.sort(arr, new Comparator<Student>() {
        @Override
        public int compare(Student o1, Student o2) {
            return o1.no - o2.no;
        }
    });
    System.out.println(Arrays.toString(arr));
}
//输出
[Student(no=1, name=lisi), Student(no=2, name=ww), Student(no=3, name=zs)]

比较结果

比较时返回负整数,零或正整数,表示第一个参数小于,等于或大于第二个参数。

正序:(o1 > o2) 返回 1
降序:(o1 > o2) 返回 -1

正序

@Override
public int compare(Student o1, Student o2) {
    if (o1.no > o2.no) {
        return 1;
    } else if (o1.no == o2.no) {
        return 0;
    } else {
        return -1;
    }
}

降序

@Override
public int compare(Student o1, Student o2) {
    if (o1.no > o2.no) {
        return -1;
    } else if (o1.no == o2.no) {
        return 0;
    } else {
        return 1;
    }
}

示例

// 降序
public static void main(String[] args) {
    @Data
    @AllArgsConstructor
    class User{
        String name;
        int age;
    }

    List<User> list = new ArrayList<>();
    list.add(new User("a", 21));
    list.add(new User("c", 2));
    list.add(new User("g", 44));
    list.add(new User("e", 1));

    List<String> collect = list.stream()
            .sorted(Comparator.comparing(User::getAge, Comparator.reverseOrder()))
            .limit(3)
            .map(x -> x.getName())
            .collect(Collectors.toList());
    System.out.println(collect);
}