java中List集合排序

    在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实现了这个接口。

猜你喜欢

转载自kibear.iteye.com/blog/2338639