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

Java对象比较-comparable接口和comparator比较器

程序员文章站 2022-03-04 20:09:40
...

1.实现对对象的比较大部分是为了对数组或者集合中的对象进行排序,让他们根据一定的规则存储在数组或有序集合中

2.实现方式有两种,一种是存储的对象的类实现comparable接口,第二种是使用comparator比较器,也有人称为comparator匿名

内部类;两种方式都是通过给对象提供一个自定义的比较规则去实现对象之间的比较

3.首先了解一下比较规则

Java对象比较-comparable接口和comparator比较器

程序实现比较的核心是编写比较规则,在实现comparable接口方法中是实现compareTo方法,return返回正数则代表前一个对象“大”需要排在后面,返回0表示对象级别“相同”,负数与正数相反;

comparator比较器同过编写compare方法,返回值return的内容同上述比较规则;

4.现在看一下comparable接口实现比较功能的一些案例

Java对象比较-comparable接口和comparator比较器

此处的对象列表对应list,有序映射中的键对应key值

给出一个示例student类

 

package StudyJava;

public class student implements Comparable<student> {
	
	private String name;
	private int age;
	private String sex;
	
	
	
	
	public student(String name, int age, String sex) {
		super();
		this.name = name;
		this.age = age;
		this.sex = sex;
	}


	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 String getSex() {
		return sex;
	}


	public void setSex(String sex) {
		this.sex = sex;
	}
	
	


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

    // 希望以年龄先排序,再以姓名排序,最后以性别排序,男前女后
	@Override
	public int compareTo(student stu) {
		
		int result = 0;
		
		result = this.age==stu.age ? result=0 : (this.age>stu.age ? 1 : -1);
		
		if(result==0){
		  result = this.name.compareTo(stu.name);
		}
		
		if(result==0){
			result = -this.sex.compareTo(stu.sex);
		}
		
		return result;
	}
	

}

通过compareTo的返回值去实现你的排序规则

package StudyJava;

import java.util.Arrays;

public class test {

	public static void main(String[] args) {
		student[] students = new student[6];
		students[0] = new student("AA", 21, "female");
		students[1] = new student("FF", 42, "female");
		students[2] = new student("BB", 21, "man");
		students[3] = new student("AA", 21, "man");
		students[4] = new student("DD", 33, "female");
		students[5] = new student("CC", 22, "man");
		
		for(student stu : students){
			System.out.println(stu.toString());
		}		
		
		System.out.println("..........");
		
		Arrays.sort(students);
		
		for(student stu : students){
			System.out.println(stu.toString());
		}	

	}

}

测试结果:

Java对象比较-comparable接口和comparator比较器

也有遇到过自己编写比较方法,但实现底层依然交由comparator的compare方法实现

Java对象比较-comparable接口和comparator比较器

这里按照输入的参数名,以该参数作为规则排序 内部传入list集合参数,对集合处理后返回处理过的新list

使用的是comparator比较器实现

 

5.comparator比较器实现

System.out.println("comparator比较器实现对象比较......");
		
		
		List<teacher> list = new ArrayList<teacher>();
		list.add(new teacher("ZZ", 30));
		list.add(new teacher("AA", 30));
		list.add(new teacher("CC", 24));
		
		
		for(teacher tea : list){
			System.out.println(tea.toString());
		}
		
		System.out.println("........");
		
		Collections.sort(list, new Comparator<teacher>() {

			@Override
			public int compare(teacher arg0, teacher arg1) {
				int result = 0;
				if(arg0.getAge()==arg1.getAge()){
					
					result = arg0.getName().compareTo(arg1.getName());
					
				}else if(arg0.getAge()>arg1.getAge()){
					result = 1;
				}else{
					result = 0;
				}
				
				
				
				
				return result;
			}
			
		});
		
		
		
		for(teacher tea : list){
			System.out.println(tea.toString());
		}
		

测试结果:

Java对象比较-comparable接口和comparator比较器

其中,comparator匿名内部类本身是使用无参构造函数,在实现比较规则中利用String类的comparaTo

方法可以实现对字符串进行字典集规则比较