Java的比较器Comparable与Comparator

1,994 阅读2分钟

在Java中有两个比较器:ComparableComparator

对于Integer、Double等等类型,可以直接对他们进行比较,因为已经实现了比较的方式,然而在平时常常会面临需要对集合进行排序的情况,这种情况下我们需要人工定义Java比较器,告诉程序两个对象如何比较大小。

Comparable

Comparable称为内部比较器,因为我们创建需要排序的类还要实现这个类,在创建之初就要人工规定好了排序方式。

实现这个类,然后我们需要重写他的compareTo方法,传递一个类进入,与当前本身类进行比较,返回值是一个int类型。

比较规则是:如果本身 - 传入 > 0,且返回的是正数,那么就是按照升序排列,如果返回的是负数,就是按照降序排列。也可以看成return a-b是升序,return b-a是降序。

如果调用compare方法大于0,就把前一个数和后一个数交换,也就是把大的数放后面了,即所谓的升序了。如果小于等于0,那么就不会交换了。

import java.util.*;
public class Test {
	public static void main(String[] args) {
		
		MySort m1 = new MySort();
		MySort m2 = new MySort();
		m1.setId(10);
		m2.setId(8);

		LinkedList<MySort> list = new LinkedList<>();
		list.add(m1);
		list.add(m2);

		System.out.println(list.get(0).getId() + " ");
		System.out.println(list.get(1).getId());
		Collections.sort(list);
		System.out.println(list.get(0).getId() + " ");
		System.out.println(list.get(1).getId());
	}

class MySort implements Comparable<MySort> {
	private String name;
	private int id;
	
	public void setName(String name) {
		this.name = name;
	}
	
	public String getName() {
		return name;
	}
	
	public void setId(int id) {
		this.id = id;
	}
	
	public int getId() {
		return id;
	}
	
	@Override
	public int compareTo(MySort o) {
        // 按照升序排序,低->高
		if (id - o.id > 0) {
			return 1;
		} else if (id - o.id == 0) {
			return 0;
		} else {
			return -1;
		}
	}
}

Comparator

Comparator称为外部比较器,因为Comparator可以脱离所需要比较的类,比如要对没有实现Comparable的类进行比较,存在List中,这时候如果要排序的话,可以在Collections.sort() 中传入一个Comparator比较器,重写该比较器的compare方法即可。

import java.util.*;
public class Test {
	public static void main(String[] args) {
		MySort m1 = new MySort();
		MySort m2 = new MySort();
		m1.setId(10);
		m2.setId(8);

		LinkedList<MySort> list = new LinkedList<>();
		list.add(m1);
		list.add(m2);

		System.out.print(list.get(0).getId() + " ");
		System.out.println(list.get(1).getId());
		Collections.sort(list, new Comparator<MySort>() {
			@Override
			public int compare(MySort o1, MySort o2) {
				if (o1.getId() - o2.getId() > 0) {
					return 1;
				} else if (o1.getId() - o2.getId() == 0) {
					return 0;
				} else {
					return -1;
				}
			}
		});
		System.out.print(list.get(0).getId() + " ");
		System.out.println(list.get(1).getId());
	}
}

class MySort {
	private String name;
	private int id;
	
	public void setName(String name) {
		this.name = name;
	}
	
	public String getName() {
		return name;
	}
	
	public void setId(int id) {
		this.id = id;
	}
	
	public int getId() {
		return id;
	}
}