如何对List集合按照对象的某一属性排序

在进行软件构造实验三的过程中,遇到了对List集合按照对象的某一属性排序的问题,我们知道,在一般的情况下,java中提供了对集合进行操作的工具类Collections,
Collections能够对集合中的元素用默认的排序方法sort来根据元素的自然顺序对指定集合按升序进行排序。

  1. 对于常用的java自带的类:
    在java中,很多类自己实现好了Comparable接口,并且重写了comepareTo方法,所以我们可以直接调用方法就可以实现排序。我们拿Integer类来举例子:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
 
public class Test{
	public static void main(String[] args) {
		//创建
		List<Integer> list = new ArrayList<Integer>();
		list.add(9);
		list.add(2);
		list.add(5);
		list.add(1);
		System.out.println(list);
		//排序
		Collections.sort(list);
		System.out.println(list);
	}
}

输出结果

 [9 2 5 1]
 [1 2 5 9]

2.对于自定义的类,按照类中某种属性就行排序,有两种方法:
方法一:
在我们自定义的类实现Comparable接口,并在类中重写public int compareTo(T o)方法。我们这个例子中对Entity集合按照Entuty里面的的age进行排序如下所示:

public class Test 
{
    public static void main(String[] args) 
    {
        ArrayList<Entity> list=new ArrayList<Entity>();
        list.add(new Entity("余涛",24));
        list.add(new Entity("王宁",13));
        list.add(new Entity("崔同发",25));
        System.out.println("排序前:"+list);
        Collections.sort(list);
        System.out.println("排序后:"+list);
    }
}
class Entity implements Comparable<Entity>
{
    String name;
    int age;
    public Entity(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Entity [name=" + name + ", age=" + age + "]";
    }
    @Override
    public int compareTo(Entity o) 
    {
        if(this.getAge()>o.getAge())
        {
            return 1;
        }
        else if(this.getAge()<o.getAge())
        {
            return -1;
        }
        else
        {
            return 0;
        }
    }
}

为了对Entity这个类按照age的属性值从小到大排序,则让Entity这个类实现Comparable接口,并编写public int compareTo(Entity o) 方法。这样使用Collections.sort(list);就可以对list中的对象进行按照age大小排序。
根据>和<的情况返回的是1还是-1可以实现从大到小排序或者从小到大排序。
输出结果:

排序前:[Entity [name=余涛, age=24], Entity [name=王宁, age=13], Entity [name=崔同发, age=25]]
排序后:[Entity [name=王宁, age=13], Entity [name=余涛, age=24], Entity [name=崔同发, age=25]]

方法二:
在排序的时候,给sort()方法传入一个比较器。传入一个实现比较器接口的匿名内部类,告诉sort()方法按照比较器来对list中的对象进行排序。如下所示:

public class Test 
{
    public static void main(String[] args) 
    {
        ArrayList<Entity> list=new ArrayList<Entity>();
        list.add(new Entity("余涛",24));
        list.add(new Entity("王宁",13));
        list.add(new Entity("崔同发",25));
        System.out.println("排序前:"+list);
        Collections.sort(list,new Comparator<Entity>() {
        @Override
        public int compare(Entity o1, Entity o2) 
        {
            if(o1.getAge()>o2.getAge())
            {
                return 1;
            }
            else if(o1.getAge()<o2.getAge())
            {
                return -1;
            }
            else
            {
                return 0;
            }
        }
    });
        System.out.println("排序后:"+list);
    }
}
class Entity
{
    String name;
    int age;
    public Entity(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Entity [name=" + name + ", age=" + age + "]";
    }
}

输出结果:

排序前:[Entity [name=余涛, age=24], Entity [name=王宁, age=13], Entity [name=崔同发, age=25]]
排序后:[Entity [name=王宁, age=13], Entity [name=余涛, age=24], Entity [name=崔同发, age=25]]

以上便是对List集合按照对象的某一属性排序的方法。
参考文章


版权声明:本文为weixin_44993415原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。