目录

一、Comparable接口:自然排序

二、Comparator接口:定制排序

三、简单对比

使用说明:Java中的对象,正常情况下,只能进行比较:== 或 !=。不能使用 > 或 < 。但是在开发场景中,我们需要对多个对象进行排序,言外之意,就需要比较对象的大小。这就需要使用:Comparable 或 Comparator。

 一、Comparable接口:自然排序

1. 像String,包装类等实现了Comparable接口,重写了compareTo(obj)方法,给出了比较两个对象大小的方式。

2. 像String、包装类重写compareTo(obj)方法以后,进行了从小到大的排列。

3. 重写compareTo(obj)的规则:

        如果当前对象this大于形参对象obj,则返回正整数。

        如果当前对象this小于形参对象obj,则返回负整数。

        如果当前对象this等于形参对象obj,则返回零。

4. 对于自定义类来说,如果需要排序,则可以让自定义类实现Comparable接口,重写compareTo(obj)方法,在compareTo()方法中指明如何排序。如果不实现接口进行Arrays.sort(); 排序,则会报错。

 示例代码:

public class ComparableTest {

	public static void main(String[] args) {
		Person[] persons = new Person[4];
		persons[0] = new Person("ht", 21);
		persons[1] = new Person("chm", 21);
		persons[2] = new Person("hc", 20);
		persons[3] = new Person("ch", 19);
		
		Arrays.sort(persons);
		System.out.println(Arrays.toString(persons));
        // [Person [name=ch, age=19], Person [name=hc, age=20], Person [name=chm, age=21], Person [name=ht, age=21]]
	}

}

class Person implements Comparable{ 
	
	private String name;
	private int age;

	// 指明商品比较大小的方式:按照年龄升序排序,如果相同则按名字升序排序。
	@Override
	public int compareTo(Object o) {
		if(o instanceof Person) {
			Person person = (Person)o;
			if(this.age > person.age) 
				return 1;
			else if(this.age < person.age) 
				return -1;
			else 
				return this.name.compareTo(person.name); // String已经实现了Comparable接口,可直接使用compareTo();
			
		}
		throw new RuntimeException("传入的参数类型不一致");
		
	}

	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;
	}

	public Person() {
	}

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

	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
	
	
}

二、Comparator接口:定制排序

背景:当元素的类型没有实现java.lang.Comparable接口而又不方便修改代码,或者实现了java.lang.Comparable接口的排序规则不适合当前的操作,那么可以考虑使用Comparator的对象来排序。

1. 重写compare(Object o1, Object o2)方法,比较o1和o2的大小:如果返回正数,则o1大于o2;如果返回0,表示相等;如果返回负整数,表示o1小于o2。

示例代码:

public static void main(String[] args) {
		String[] arr = new String[]{"a","d","g","c","e","f"};
		Arrays.sort(arr, new Comparator() {

			// 按照字符串降序排列
			@Override
			public int compare(Object o1, Object o2) {
				if(o1 instanceof String && o2 instanceof String) {
					String s1 = (String)o1;
					String s2 = (String)o2;
					return -s1.compareTo(s2);
				}
				throw new RuntimeException("输入的数据类型不一致");
			}
			
		});
		System.out.println(Arrays.toString(arr));
	}
public class ComparatorTest {

	public static void main(String[] args) {
		Person[] persons = new Person[4];
		persons[0] = new Person("ht", 21);
		persons[1] = new Person("chm", 21);
		persons[2] = new Person("hc", 20);
		persons[3] = new Person("ch", 19);
		
		Arrays.sort(persons, new Comparator<Person>() {

			@Override
			public int compare(Person o1, Person o2) {
				// 先按照名字升序,再按照年龄降序
				if(o1.getName().equals(o2.getName())) {
					return -Double.compare(o1.getAge(), o2.getAge());
				}else {
					return o1.getName().compareTo(o2.getName());
				}
			}
		});
		System.out.println(Arrays.toString(persons));
        // [Person [name=ch, age=19], Person [name=chm, age=21], Person [name=hc, age=20], Person [name=ht, age=21]]
	}

}
class Person{ 
	
	private String name;
	private int 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;
	}

	public Person() {
	}

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

	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
	
	
}

三、简单对比

1. Comparable接口的方式一旦指定,能够保证实现类的在任何位置都能比较大小。

2. Comparator接口的方式属于临时性的比较。

本文地址:https://blog.csdn.net/qq_41955460/article/details/113947912