简介
说明
本文用示例介绍Java的ArrayList排序的方法。
List排序方法
主要有三种方法(按推荐度排序):
- JDK8的stream
- Comparator#compare()
- Comparable#compareTo()
法1:list的sort()
代码
package com.example.a;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
class User{
private Integer score;
private Integer age;
public User(Integer score, Integer age){
super();
this.score = score;
this.age = age;
}
public Integer getScore() {
return score;
}
public void setScore(Integer score) {
this.score = score;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
public class Demo {
public static void main(String[] args) {
List<User> users = new ArrayList<>();
users.add(new User(95, 26));
users.add(new User(84, 23));
users.add(new User(96, 25));
users.add(new User(95, 24));
// 单字段排序
users.sort(Comparator.comparing(User::getAge));
for(User user : users){
System.out.println(user.getScore() + "," + user.getAge());
}
System.out.println("---------------------------------");
// 多字段排序(法1)
users.sort((o1, o2) -> {
// 这里必须要在中间加分隔符。否则,若都是数字,会变成数字相加,再转为字符串
String tmp1 = o1.getScore() + ":" + o1.getAge();
String tmp2 = o2.getScore() + ":" + o2.getAge();
return tmp1.compareTo(tmp2);
});
for(User user : users){
System.out.println(user.getScore() + ":" + user.getAge());
}
System.out.println("---------------------------------");
// 多字段排序(法2)
users.sort((o1, o2) -> {
int i = o2.getScore() - o1.getScore();
if (i == 0) {
return o1.getAge() - o2.getAge();
}
return i;
});
for(User user : users){
System.out.println(user.getScore() + "," + user.getAge());
}
}
}
测试
84,23 95,24 96,25 95,26 --------------------------------- 84:23 95:24 95:26 96:25 --------------------------------- 96,25 95,24 95,26 84,23
法2:JDK8的stream
见:Java–Stream(流)–使用/实例/流操作 – 自学精灵
法3:Comparator#compare()
需求:用户有成绩和年龄。按成绩排序,若成绩相同,则按年龄排序。
package org.example.a;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
class User{
private int score;
private int age;
public User(int score, int age){
super();
this.score = score;
this.age = age;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class Demo {
public static void main(String[] args) {
List<User> users = new ArrayList<User>();
users.add(new User(95, 26));
users.add(new User(84, 23));
users.add(new User(96, 25));
users.add(new User(95, 24));
Collections.sort(users, new Comparator<User>() {
@Override
public int compare(User o1, User o2) {
int i = o2.getScore() - o1.getScore();
if(i == 0){
return o1.getAge() - o2.getAge();
}
return i;
}
});
for(User user : users){
System.out.println(user.getScore() + "," + user.getAge());
}
}
}
执行结果
96,25 95,24 95,26 84,23
法4:Comparable#compareTo()
默认按增序排序:
package org.example.a;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Demo {
public static void main(String[] args) {
List<Integer> nums = new ArrayList<Integer>();
nums.add(3);
nums.add(5);
nums.add(1);
nums.add(0);
System.out.println(nums);
Collections.sort(nums);
System.out.println(nums);
}
}
执行结果:
[3, 5, 1, 0] [0, 1, 3, 5]
需求:用户有成绩和年龄。按成绩降序排序,若成绩相同,则按年龄正序排序。
package org.example.a;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
class User implements Comparable<User>{
private int score;
private int age;
public User(int score, int age){
super();
this.score = score;
this.age = age;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int compareTo(User o) {
int i = o.getScore() - this.getScore();
if(i == 0){
return this.getAge() - o.getAge();
}
return i;
}
}
public class Demo {
public static void main(String[] args) {
List<User> users = new ArrayList<User>();
users.add(new User(95, 26));
users.add(new User(84, 23));
users.add(new User(96, 25));
users.add(new User(95, 24));
Collections.sort(users);
for(User user : users){
System.out.println(user.getScore() + "," + user.getAge());
}
}
}
执行结果
96,25 95,24 95,26 84,23

请先 !