【Java__比较】Comparable 和 Comparator的区别

区别

  • comparable接口实际上是出自java.lang包 它有一个compareTo(Object obj)方法用来排序
  • comparator接口实际上是出自java.util包 它有一个compare(Object obj1,Object obj2)方法用来排序

Comparator定制排序

	ArrayList<Integer> arrayList = new ArrayList<Integer>();
	arrayList.add(-1);
	arrayList.add(3);
	arrayList.add(3);
	arrayList.add(-5);
	arrayList.add(7);
	arrayList.add(4);
	arrayList.add(-9);
	arrayList.add(-7);
	System.out.println("原始数组:");
	System.out.println(arrayList);
	// void reverse(List list):反转
	Collections.reverse(arrayList);
	System.out.println("Collections.reverse(arrayList):");
	System.out.println(arrayList);
	// void sort(List list),按⾃然排序的升序排序
	Collections.sort(arrayList);
	System.out.println("Collections.sort(arrayList):");
	System.out.println(arrayList);
	// 定制排序的⽤法
	Collections.sort(arrayList, new Comparator<Integer>() {
		@Override
		public int compare(Integer o1, Integer o2) {
			return o2.compareTo(o1);
		}
	});
	System.out.println("定制排序后:");
	System.out.println(arrayList);

重写compareTo⽅法实现按年龄来排序

package po;

//person对象没有实现Comparable接⼝,所以必须实现,这样才不会出错,才可以使treemap中的数据按顺序排列
//前⾯⼀个例⼦的String类已经默认实现了Comparable接⼝,详细可以查看String类的API⽂档,另外其他
//像Integer类等都已经实现了Comparable接⼝,所以不需要另外实现了
public class Person implements Comparable<Person> {
	private String name;
	private int age;

	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	/**
	 * TODO重写compareTo⽅法实现按年龄来排序
	 */
	@Override
	public int compareTo(Person o) {
		// TODO Auto-generated method stub
		if (this.age > o.getAge()) {
			return 1;
		} else if (this.age < o.getAge()) {
			return -1;
		}
		return age;
	}
}
	public static void main(String[] args) throws Exception {
		TreeMap<Person, String> pdata = new TreeMap<Person, String>();
		pdata.put(new Person("张三", 30), "zhangsan");
		pdata.put(new Person("李四", 20), "lisi");
		pdata.put(new Person("王五", 10), "wangwu");
		pdata.put(new Person("小红", 5), "xiaohong");
		// 得到key的值的同时得到key所对应的值
		Set<Person> keys = pdata.keySet();
		for (Person key : keys) {
			System.out.println(key.getAge() + "-" + key.getName());
		}
	}

摘自 JavaGuide

原文地址:https://www.cnblogs.com/kikyoqiang/p/13293903.html