java 中 自定义对象数组排序 Arrays.sort()方法 以及 Compareable接口和Compartor接口对比分析

#java 中 自定义对象数组排序 Arrays.sort()方法 以及 Compareable接口和Compartor接口对比分析


对自定义对象数组排序,需要引入“比较器”,的概念。
Compareable和Compartor接口就是比较器抽象接口,通过实现类,重写接口方法来进行对象比较。

Arrays.sort()有2个重载方法,见下

这里写图片描述

##sort(Objetc[] a)

当使用sort(Objetc[] a)来进行对象的自然排序,该对象必需实现Compareable接口,重写compareableTo方法,并一般在此方法中定义这3种返回值(1,0,-1)来进行排序标准的确认。

  • return 1 时,按照从小到大排序
  • return 0 时,原位置不动
  • return-1 时,按照从在到小排序

而让对象继成Compareable接口的方式,称为内部比较器。

注意,返回值常规用1,0,-1,并不是说一定要用1或者-1.此处的1和-1只代表俩值相减后为正数还是负数,那么,如果这样理解,我们同样也可以反回 2,0,-2

ps: Collections.sort()方法和Arrays.sort()方法类似,对象也都需要实现Compareable接口。

下面看例

public class Student implements Comparable {

	String name;
	Integer age;

	public Student(String name, Integer age) {
		super();
		this.name = name;
		this.age = age;
	}

	public Student() {
		super();
	}

	public String getName() {
		return name;
	}

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

	public Integer getAge() {
		return age;
	}

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

	@Override
	public int compareTo(Object o) {
		// TODO Auto-generated method stub

		if (o instanceof Student) {
			Student s = (Student) o;
			if (this.age > s.age) {
				return 1;
			} else if (this.age == s.age) {
				return 0;
			} else {
				return -1;
			}
		}
		return 0;

	}

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

}     

public class App {
	
	
	public static void main(String[] args) {
		Student s1 = new Student("张一",5);
		Student s2 = new Student("张二",3);
		Student s3 = new Student("张三",4);
		Student s4 = new Student("张四",1);
	
		Student[] stu =new Student[4];
		stu[0]=s1;
		stu[1]=s2;
		stu[2]=s3;
		stu[3]=s4;
		
		
		Arrays.sort(stu);
		
		
		System.out.println(Arrays.toString(stu));  

输出结果

[Student [name=张四, age=1], Student [name=张二, age=3], Student [name=张三, age=4], Student [name=张一, age=5]]

此时我们得到一个age从小到大的结果, 试想,如果我们想要age从大到小的话,那要怎么做呢?
很简单,只需要在compareTo方法中,把return时的1改为-1,-1改为1就成了。

sort(T[] a, Comparator>? super T<> c)


当调用此方法来进行自定义数组排序时,需要我们指定外部比较器。

操作流程为: 定义一个类,如CustomRule,实现Comparator接口,重写其Compare方法 。
那么,CustomRule这种类的定义就是为了给自定义对象排序,它也就是外部比较器。

看例

public class Student2 implements Comparable {

	Integer age;
	Integer score;
	String name;

	public Student2() {
		super();
		// TODO Auto-generated constructor stub
	}

	public Student2(Integer age, Integer score, String name) {
		super();
		this.age = age;
		this.score = score;
		this.name = name;
	}

	public Integer getAge() {
		return age;
	}

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

	public Integer getScore() {
		return score;
	}

	public void setScore(Integer score) {
		this.score = score;
	}

	public String getName() {
		return name;
	}

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

	@Override
	public int compareTo(Object o) {

		Student2 s = (Student2) o;
		if (this.age > s.age) {
			return 1;
		} else if (this.age == s.age) {
			return 0;
		} else {
			return -1;
		}

	}

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

}     

public class CustomRule implements Comparator {

	@Override
	public int compare(Object o1, Object o2) {
		Student2 stu1 = (Student2) o1;
		Student2 stu2 = (Student2) o2;
		return stu1.score - stu2.score;

	}

}    

public class App2 {

	public static void main(String[] args) {
		Student2 s1 = new Student2(5, 50, "张一");
		Student2 s2 = new Student2(3, 15, "张二");
		Student2 s3 = new Student2(4, 70, "张三");
		Student2 s4 = new Student2(1, 23, "张四");

		Student2[] stu = new Student2[4];
		stu[0] = s1;
		stu[1] = s2;
		stu[2] = s3;
		stu[3] = s4;

		Arrays.sort(stu, new CustomRule());
		System.out.println(Arrays.toString(stu));

	}

}   

运算结果

[Student2 [age=3, score=15, name=张二], Student2 [age=1, score=23, name=张四], Student2 [age=5, score=50, name=张一], Student2 [age=4, score=70, name=张三]]

##Compareable接口和Compartor接口对比


在这里插入图片描述

  • compareTo方法返回值一般默认设置1;0,-1;但其实只要是>0是代表自然正序排列,<0代表自然排序倒序.

说明 :

  • 当使用外部比较器Compartor时,同时对象也实现了Compareable,并重写了其方法,但只生效外部比较器。
  • 内部比较器嵌入到对象中,因为就只是执行一个CompareTo方法,可以看做只是一套比对方案,而外部比较器,可以定义多个,根据需求调用,较灵活。

另外,关于String 中 CompareTo方法总结,可查看本人转载博文 https://blog.csdn.net/ted_cs/article/details/82712248

End!
lalala,我还是我,一个和你一样渴望成为大牛的初级程序员。今天分享结束了。
以上内容如有帮到你,请点赞,评论,收藏。帮我安排一下。

这里写图片描述

  • 32
    点赞
  • 83
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值