java list对象排序 Comparable和Comparator区别

本文详细介绍了Java中对象排序的方法,包括实现Comparable接口进行内部排序,以及使用Comparator接口进行外部排序的过程,并通过具体代码示例展示了两种方式的具体应用。

java中需要对对象进行排序时,那么这个对象需要实现Comparable,Comparable接口是一个排序接口,当对象实现了这个接口就支持排序。这个可以参考jdk中的String实现。下面看一段代码。

person类,实现了Comparable接口,按照年龄进行排序,年龄相同时按照姓名进行排序,String类已经实现了Comparable接口,直接调用compareTo方法即可

public class Person implements Comparable<Person>{
	
	private String name;
	
	private int age;
	
        //构造方法
        //set、get代码...
	
	public int compareTo(Person p) {
		// TODO Auto-generated method stub
		if (this.age == p.age) {
			return this.name.compareTo(p.name);
		} else {
			return this.age - p.age;
		}
	}
	
	
}

调用

public static void main(String[] args) {
		List<Person> list = new ArrayList<Person>();
		Person p1 = new Person("A1", 10);
		Person p2 = new Person("A2", 8);
		Person p3 = new Person("A3", 9);
		Person p4 = new Person("A5", 6);
		Person p5 = new Person("A4", 6);
		Person p6 = new Person("A6", 12);
		Person p7 = new Person("A7", 5);
		list.add(p1);
		list.add(p2);
		list.add(p3);
		list.add(p4);
		list.add(p5);
		list.add(p6);
		list.add(p7);
		Collections.sort(list);
		for (Person p : list) {
			String s = p.toString();
			System.out.println(s);
		}
	}

结果:

name:A7;age:5
name:A4;age:6
name:A5;age:6
name:A2;age:8
name:A3;age:9
name:A1;age:10
name:A6;age:12

如果person类没有实现Comparable接口,那么我们在外部调用排序时就需要使用到Comparator接口

public static void main(String[] args) {
		List<Person> list = new ArrayList<Person>();
		Person p1 = new Person("A1", 10);
		Person p2 = new Person("A2", 8);
		Person p3 = new Person("A3", 9);
		Person p4 = new Person("A5", 6);
		Person p5 = new Person("A4", 6);
		Person p6 = new Person("A6", 12);
		Person p7 = new Person("A7", 5);
		list.add(p1);
		list.add(p2);
		list.add(p3);
		list.add(p4);
		list.add(p5);
		list.add(p6);
		list.add(p7);
		
		//Collections.sort(list);
		
		Collections.sort(list, new Comparator<Person>() {

			public int compare(Person p1, Person p2) {
				// TODO Auto-generated method stub
				if (p1.getAge() == p2.getAge()) {
					return p1.getName().compareTo(p2.getName());
				} else {
					return p1.getAge() - p2.getAge();
				}
			}
			
		});
		
		for (Person p : list) {
			String s = p.toString();
			System.out.println(s);
		}
		
		
	}

结果:

name:A7;age:5
name:A4;age:6
name:A5;age:6
name:A2;age:8
name:A3;age:9
name:A1;age:10
name:A6;age:12

可以看到实现了接口Comparable和外部使用Comparator接口结果相同。

总结:

不同点:

Comparable是一个内部比较接口,通常对象需要内部排序时直接实现

Comparator是一个外部比较接口,通常在对象中没有实现排序接口而有需要进行排序时实现

相同点:

两个的功能相似,只不过一个是内部一个是外部。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值