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

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

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

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

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

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

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

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

此处的对象列表对应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());
		}	

	}

}

测试结果:

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

这里按照输入的参数名,以该参数作为规则排序 内部传入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());
		}
		

测试结果:

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值