实现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);
}