Java笔记-I/O流之比较器接口对象数组排序

对象数组排序

内容介绍

1.对象数组直接调用sort()方法报错的原因:

是因为没有定义比较的规则,需要自己定义。


2.如何定义规则?看报错信息:

ClassCastException: demoCompare.Person cannot be cast to java.lang.Comparable

表达的意思就是:
当前比较的对象的那个类没有实现Comparable 接口,在接口中需要定义比较的规则。

这个接口就是比较器接口


3.比较规则:

如果方法返回正整数:表示调用者大于参数对象。
如果方法返回负整数:表示调用者小于参数对象 。
如果方法返回0:表示两个对象相等。


4.比较原理:

Arrays.sort()方法去排序一个对象数组,那么sort()方法里面会自动拿出每一个对象去跟其他对象进行调用比较器接口的compareTo()方法进行比较。


两种比较器

1.Comparable接口

在实体类中覆写compareTo 方法,定义自己的比较规则。

演示代码如下:

1.Person.java实体类

package demoCompare;

public class Person implements Comparable<Person> {
	public String name;
	public int age;

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

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

	// 先按age升序排序,再按name升序排序
	@Override
	public int compareTo(Person o) {
		if (this.age > o.age) {
			return 1;
		}
		if (this.age < o.age) {
			return -1;
		}
		// 调用String的compareTo()方法,Java帮我们写好了
		return this.name.compareTo(o.name);
	}
}

2.Test.java测试类

public static void main(String[] args) {
	Person[] ps = { new Person("ab", 15), new Person("ad", 13), new Person("ac", 14), new Person("aa", 14) };
	Arrays.sort(ps);
	System.out.println(Arrays.toString(ps));
}

2.Comparator接口

问:如果要比较的对象数组里面的对象对应的类,不是我们自定义的,而是面试时别人提供好的class文件,我们无法修改代码,而这个类又没有实现比较器接口,怎么比较?

答:可以使用第三方比较的类。
用Comparator接口覆写Compare方法。调用sort()方法时,把第三方比较类的对象传入第二个参数使用,sort()自动调用。

这样我们不需要修改实体类的代码!

演示代码如下:

1.Person.java实体类

package demoCompare;

public class Person {
	public String name;
	public int age;

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

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

2.MyCompare.java排序类

package demoCompare;

import java.util.Comparator;

public class MyCompare implements Comparator<Person> {
	// 排序规则:
	// 先age升序排序
	// 再name降序排序
	@Override
	public int compare(Person o1, Person o2) {
		if (o1.age > o2.age) {
			return 1;
		}
		if (o1.age < o2.age) {
			return -1;
		}
		return o1.name.compareTo(o2.name);
	}

}

3.Test.java测试类

public static void main(String[] args) {
	Person[] ps = { new Person("ab", 15), new Person("ad", 13), new Person("ac", 14), new Person("aa", 14) };
	Arrays.sort(ps);
	System.out.println(Arrays.toString(ps));
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值