java list对象排序 Comparable和Comparator区别

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

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

public class Person implements Comparable{
	
	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 list = new ArrayList();
		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 list = new ArrayList();
		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() {

			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是一个外部比较接口,通常在对象中没有实现排序接口而有需要进行排序时实现

相同点:

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

 

你可能感兴趣的:(随笔日志)