欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

如何使用Collections.sort对List排序

程序员文章站 2022-04-17 11:22:41
...
针对集合元素排序,在项目中还是比较常见,最近因为项目中有遇到,总结如下:

对List元素排序实现方法大家都知道用Collections.sort();首先给大家介绍一下Comparable与Comparator的接口的区别。

1.Comparable是对象内部需要实现的接口,如果一个对象要想用利用Array.sort进行排序,那么这个对象必须实现Comparable的接口,比较的实现规则是在对象的内部进行的,然后直接调用Collections.sort()即可。

2.Comparator接口是在对象外实现的接口,主要是方便了对没有实现Comparable接口的对象的比较和排序,比如:当我们对已经有的 一个类进行排序的时候,这个类又没有实现Comparable接口,那么我们可以利用Collections.sort(list,mew Comparator<?>(){})来排序,同时实现一个 Comparator接口实现对这个类的排序。

以下两个例子分别详细说明:实现对User类先按照名字字母先后顺序排序,名字相同情况下,再按照年龄大小排序

测试代码如下:

1、在对象内部实现具体的排序规则
User类:
public class User implements Comparable<Object>{
	//年龄
	private Integer age;
	//名字
	private String name;

	public Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

    //排序方法内部实现
	@Override
	public int compareTo(Object o) {
		User user = (User)o;
		//step1、先按照名字字母顺序排序 
		if(this.getName() != null && user.getName() != null 
				&& 0 != this.getName().compareTo(user.getName())){
			return this.getName().compareTo(user.getName());
		}else{
			 //step2、 针对名字相同的再按照然后按照年龄大小排序
			if (this.getAge() != null && user.getAge() != null) {
				return this.getAge() - user.getAge();
			}
			return 0;
		}
	}

}

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class TestUserSort {
	
	public TestUserSort(){
		
	}
	
	//sort实现按照名字、年龄大小排序
	public static List<User> sortUser(){
		List<User> userList = new ArrayList<User>();
		String[] nameArry = {"ab","ccddd","ab","cd","faaa","ab"};
		Integer[] ageArry = {3,6,9,4,7,1};
		for(int i=0;i<6;i++){
			User user = new User();
			user.setName(nameArry[i]);
			user.setAge(ageArry[i]);
			userList.add(user);
		}
		return userList;
	} 

	public static void main(String[] args){
		List<User> userList = sortUser();
		Collections.sort(userList);
		
		for(User us : userList){
			System.out.println(us.getName()+"的年龄是:"+us.getAge());
		}
		
	}

}


2、在对象外部实现具体的排序规则(推荐使用)

User类:
public class User{
    //年龄
    private Integer age;
    //名字
    private String name;

    
    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


}

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Comparator;

public class TestUserSort {
	
	public TestUserSort(){
		
	}
	
	//sort实现按照名字、年龄大小排序
	public static List<User> sortUser(){
		List<User> userList = new ArrayList<User>();
		String[] nameArry = {"ab","ccddd","ab","cd","faaa","ab"};
		Integer[] ageArry = {3,6,9,4,7,1};
		for(int i=0;i<6;i++){
			User user = new User();
			user.setName(nameArry[i]);
			user.setAge(ageArry[i]);
			userList.add(user);
		}
		return userList;
	} 

	public static void main(String[] args){
		List<User> userList = sortUser();
		Collections.sort(userList, new Comparator<User>(){
			public int compare(User o1,User o2){
				//step1、先按照名字字母顺序排序 
				if(o1.getName() != null && o2.getName() != null 
						&& 0 != o1.getName().compareTo(o2.getName())){
					return o1.getName().compareTo(o2.getName());
				}else{
					 //step2、 针对名字相同的再按照然后按照年龄大小排序
					if (o1.getAge() != null && o2.getAge() != null) {
						return o1.getAge() - o2.getAge();
					}
					return 0;
				}
			}
			
		});
		
		for(User us : userList){
			System.out.println(us.getName()+"的年龄是:"+us.getAge());
		}
		
	}

}


两种方法运行结果:
ab的年龄是:1
ab的年龄是:3
ab的年龄是:9
ccddd的年龄是:6
cd的年龄是:4
faaa的年龄是:7