欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java比较器

程序员文章站 2022-03-26 16:45:41
使用说明:Java中的对象,正常情况下,只能进行比较:== 或 !=。不能使用 > 或 < 。但是在开发场景中,我们需要对多个对象进行排序,言外之意,就需要比较对象的大小。这就需要使用:Comparable 或 Comparator。一、Comparable接口:自然排序1. 像String,包装类等实现了Comparable接口,重写了compareTo(obj)方法,给出了比较两个对象大小的方式。2. 像String、包装类重写compareTo(obj)方法以后,进行了从.....

目录

一、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