Comparable和Comparator

本文详细介绍了Java中用于排序的Comparable和Comparator接口的区别及应用。解释了如何通过实现Comparable接口为对象提供自然排序,以及如何利用Comparator接口实现自定义排序逻辑。此外,还提供了具体的代码示例来展示这两种接口的用法。

对于Comparable接口来说,仅包含一个compareTo方法,public int compareTo(Object o) {},仅有一个参数。

对于Comparator接口来说,仅包含一个compare方法,public int compare(Object o1, Object o2) {},有两个参数。Comparator一般会被单独实现。

实现Comparator接口的类被称作比较器。

package pac;

class User implements Comparable{
	@Override
	public int compareTo(Object o) {
		// TODO Auto-generated method stub
		return this.age-((User)o).getAge();
	}
	private String id;
	private int age;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public User(String id, int age) {
		super();
		this.id = id;
		this.age = age;
	}
	
}

public class Demo2 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		User u1=new User("001",18);
		User u2=new User("002",20);
		if(u1.compareTo(u2)>0) System.out.println(u1.getId()+"大");
		else System.out.println(u1.getId()+"小");
	}

}
</pre><pre code_snippet_id="1868765" snippet_file_name="blog_20160906_3_4773828" name="code" class="java">package pac;

import java.util.Comparator;

class Users{
	
	private String id;
	private int age;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public Users(String id, int age) {
		super();
		this.id = id;
		this.age = age;
	}
	
}

class UserComparator implements Comparator{
	@Override
	public int compare(Object o1, Object o2) {
		// TODO Auto-generated method stub
		return ((Users)o1).getAge()-((Users)o2).getAge();
	}
}
public class Demo3 {
	public static void main(String[] args) {
		Users u1=new Users("001",18);
		Users u2=new Users("002",20);
		Comparator cmp=new UserComparator();
		if(cmp.compare(u1, u2)>0) System.out.println(u1.getId()+"大");
		else System.out.println(u1.getId()+"小");
		
	}
}

当想要使用元素自身的自然顺序对元素进行排序时,就可以通过实现Comparable接口来实现

public class Person implements Comparable {
	public int compareTo(Object o) {
		.................
	}
}

当不想使用元素自身的自然顺序,而是想使用自定义的顺序进行排序时,此时要让集合自身具备比较功能,要定义一个类实现Comparator接口,覆盖campare()方法,可以将该类对象作为参数传递给TreeSet,实现自定义排序

public TreeSet(Comparator comparator);

public class PersonComparator implements Comparator {
	public int compare(Object o1, Object o2) {
		.....................
	}
}

Comparable接口对实现它的每个类的对象进行整体排序

Comparator接口实现对对象collection进行整体排序,可以将Comaprator传递给:

Collection.sort()方法,实现对List排序进行精确控制

Arrays.sort()方法,实现对数组排序进行精确控制

TreeSet的构造函数,实现对TreeSet集合进行精确控制

TreeMap的构造函数,实现对TreeMap进行精确控制。

传入的Comparator对象必须覆盖compare方法。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值