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

java中List集合排序  

程序员文章站 2022-03-20 17:37:04
...

    在java里面,有时候我们可能需要对list集合中的对象的某个属性进行排序。这个问题就很简单了,Collections这个工具类提供了排序的方法,有两个重载方法,一个是只接受一个List集合,另一个是接受一个list和一个 Comparator接口。我这里以第二种为例讲解,后面在简单说明一下第一种,注意默认的顺序是升序排列

    在java api中可以看到 Comparator接口里面就一个方法,int compare(T o1,  T o2),传入两个对象,关于返回值,有三种情况-1, 0, 1。-1表示o1小于o2,0表示o1等于o2,1表示o1大于o2。如果我们想要的就是升序排列,那就比较o1的o2属性,保证o1小于o2属性返回-1,o1等于o2的属性返回0,o1大于o2的属性返回1就行了,结果出来的就是升序的结集合了。还有可能想降序,那还不简单,小于返回1,大于返回-1,等于还是返回0就解决了。我们只需要明白一点,那就是程序只能通过这个compare方法返回的值来确定顺序,-1时o1排在前面,1时o1排在后面,0就不用动,Collections这个排序方法永远都是根据返回值“升序排列”。说的直白一点就是:compare方法返回-1时,表示o1排在o2的前面,返回1是表示o1排在o2的后面,至于什么情况返回-1还是1就根据业务需求来确定。

 下面看个例子:

 

package com.pzn.sort;

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

public class SortListTest {
	
	public static void main(String[] args) {
		
		List<Per> list = new ArrayList<>();
		list.add(new Per("a", "2015-11-10"));
		list.add(new Per("b", "2015-10-10"));
		list.add(new Per("c", "2015-09-10"));
		list.add(new Per("d", "2015-11-02"));
		list.add(new Per("e", "2015-10-13"));
		// 升序
		Collections.sort(list, new Comparator<Per>() {
			public int compare(Per o1, Per o2) {
				return o1.bir.compareTo(o2.bir);
			}
		});
		
		System.out.println(list);
		// 降序
		Collections.sort(list, new Comparator<Per>() {
			public int compare(Per o1, Per o2) {
				return -o1.bir.compareTo(o2.bir);
			}
		});
		
		System.out.println(list);
		
	}
}

class Per {
	
        // 不要问我这里为什么不写private,然后提供setter/getter方法,而用public。
        // 是因为我写测试代码的时候偷懒,这段注释也是写博客的时候加的。
	public final String name;
	public final String bir;
	
	public Per(String name, String bir) {
		this.name = name;
		this.bir = bir;
	}

	@Override
	public String toString() {
		return "Per [name=" + name + ", bir=" + bir + "]";
	}
}

 

 

 

 最后说说第一个排序方法,只需要传入list集合的那个方法,这个方法要求要排序的list集合中的对象所属的类要实现一个Comparable接口,可能也注意到了,上面代码中String的比较就是使用的一个compareTo方法,这个方法就是来自Comparable接口,也就是说String实现了这个接口。