比较器Comparable和Comparator

本文详细介绍了Java中的两种排序方式:Comparable接口与Comparator接口,并通过具体示例演示如何使用这两种方式对自定义对象进行排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Comparable接口

可以直接使用java.util.Arrays 类进行数组的排序操作,但对象所在的类必须实现Comparable 接口,用于指定排序接口。

Comparable 接口定义如下:

public interface Comparable<T>{

public int compareTo(T o);

}

此方法返回一个int 类型的数据,但是此int 的值只能是以下三种:

1:表示大于

-1:表示小于

0:表示相等

要求:定义一个学生类,里面有姓名、年龄、成绩三个属性,要求按成绩由高到低排序,如果成绩相等,则按照年龄由低到高排序。

import java.util.Arrays;

class Student implements Comparable<Student> {	// 指定类型为Student
	
	private String name ;
	private int age ;
	private float score ;
	
	public Student(String name,int age,float score){
		this.name = name ;
		this.age = age ;
		this.score = score ;
	}
	
	public String toString(){
		return name + "\t\t" + this.age + "\t\t" + this.score ;
	}
	
	public int compareTo(Student stu){	// 覆写compareTo()方法,实现排序规则的应用
		if(this.score>stu.score){
			return -1 ;
		}else if(this.score<stu.score){
			return 1 ;
		}else{
			if(this.age>stu.age){
				return 1 ;
			}else if(this.age<stu.age){
				return -1 ;
			}else{
				return 0 ;
			}
		}	
	}
}

public class ComparableDemo1{
	public static void main(String args[]){
		Student stu[] = {new Student("张三",20,90.0f),
			new Student("李四",22,90.0f),new Student("王五",20,99.0f),
			new Student("赵六",20,70.0f),new Student("孙七",22,100.0f)} ;
		
		Arrays.sort(stu) ;	// 进行排序操作
		System.out.println("姓名" + "\t\t" + "年龄" + "\t\t" + "成绩");
		
		for(int i=0;i<stu.length;i++){	// 循环输出数组中的内容
			System.out.println(stu[i]) ;
		}
	}
}

 输出结果:

姓名  年龄  成绩
孙七  22  100.0
王五  20  99.0
张三  20  90.0
李四  22  90.0
赵六  20  70.0

 

另一种比较器:Comparator

 

如果一个类已经开发完成,但是在此类建立的初期并没有实现Comparable接口,此时肯定是无法进行对象排序操作。为了解决这样的问题,java又定义了另一个比较器的操作接口——Comparator。

此接口定义在java.util 包中,接口定义如下:

public interface Comparator<T>{

public int compare(T o1, T o2);

boolean equals(Object obj);

}

下面定义一个自己的类,此类没有实现Comparable接口。

import java.util.* ;

//指定类型为Student
class Student{	
	private String name ;
	private int age ;
	
	public Student(String name,int age){
		this.name = name ;
		this.age = age ;
	}
	
	public boolean equals(Object obj){	// 覆写equals方法
		if(this==obj){
			return true ;
		}
		if(!(obj instanceof Student)){
			return false ;
		}
		Student stu = (Student) obj ;
		if(stu.name.equals(this.name)&&stu.age==this.age){
			return true ;
		}else{
			return false ;
		}
	}
	public void setName(String name){
		this.name = name ;
	}
	public void setAge(int age){
		this.age = age ;
	}
	public String getName(){
		return this.name ;
	}
	public int getAge(){
		return this.age ;
	}
	public String toString(){
		return name + "\t\t" + this.age  ;
	}
}

//实现比较器
class StudentComparator implements Comparator<Student>{	
	// 因为Object类中本身已经有了equals()方法
	public int compare(Student s1,Student s2){
		if(s1.equals(s2)){
			return 0 ;
		}else if(s1.getAge()>s2.getAge()){	// 按年龄比较,由低到高
			return 1 ;
		}else{
			return -1 ;
		}
	}
}

public class ComparatorDemo{
	public static void main(String args[]){
		Student stu[] = {new Student("张三",20),
			new Student("李四",22),new Student("王五",20),
			new Student("赵六",20),new Student("孙七",22)} ;
		
		Arrays.sort(stu,new StudentComparator()) ;	// 进行排序操作
		System.out.println("姓名" + "\t\t" + "年龄");
		for(int i=0;i<stu.length;i++){	// 循环输出数组中的内容
			System.out.println(stu[i]) ;
		}
	}
}

 输出结果:

姓名		年龄
张三		20
王五		20
赵六		20
李四		22
孙七		22

 总结:在使用中,尽可以还是用Comparable ,在需要排序的类上实现好此接口,而Comparator 需要单独建立一个排序的类,这样如果有很多的话,则排序的规则类也就会非常多,操作起来比较麻烦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值