18.Comparable,Comparator比较对象大小

package com.example.test2;

import java.util.Arrays;
import java.util.Comparator;
import java.util.Random;

/**
 * 
 * 比较对象大小
 * 
 * 1.重写equals()方法来比较两个对象是否相等
 * 2.实现Comaprable接口,重写compareTo()方法比较对象大小
 * 3.通过定义Comparator比较器来比较两个对象之间大小
 *
 */

class Employee implements Comparable{

	private String name;
	private int age;
	private double salary;
	
	public Employee(String name, int age, double salary){
		this.name = name;
		this.age = age;
		this.salary = salary;
	}
	
	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 double getSalary() {
		return salary;
	}

	public void setSalary(double salary) {
		this.salary = salary;
	}
	
	public String toString(){
		return String.format("%s %d %.1f\n", name, age, salary);
	}
	
	public boolean equals(Object obj){
		if (!(obj instanceof Employee)){
			return false;
		}
		Employee tmp = (Employee)obj;
		return name.equals(tmp.name) && age == tmp.age && salary == tmp.salary;
	}

	//实现Comparable接口重写compareTo()方法来进行比较
	@Override
	public int compareTo(Object o) {
		// TODO Auto-generated method stub
		Employee e = (Employee)o;
		return name.compareTo(e.name) > 0 ? 1 : (name.compareTo(e.name) == 0) ? 0 : -1;
	}
	
}

//自定义MyArrays使用冒泡排序模拟Arrays.sort()方法
class MyArrays{
	public static void sort(Object[] arr){
		for (int i = 0; i < arr.length; i++){
			for (int j = 0; j < arr.length-1-i; j++){
				if (((Comparable)arr[j]).compareTo((Comparable)arr[j+1]) > 0){
					Object tmp = arr[j];
					arr[j] = arr[j+1];
					arr[j+1] = tmp;
				}
			}
		}
	}
	
	public static void sort(Object[] arr, Comparator comparator){
		for (int i = 0; i < arr.length; i++){
			for (int j = 0; j < arr.length-1-i; j++){
				if (comparator.compare(arr[j], arr[j+1]) > 0){
					Object tmp = arr[j];
					arr[j] = arr[j+1];
					arr[j+1] = tmp;
				}
			}
		}
	}
}

public class TestDemo {
	
	//通过匿名类来自定义比较器
	public static Comparator AGE_SORT = new Comparator(){

		@Override
		public int compare(Object o1, Object o2) {
			// TODO Auto-generated method stub
			Employee e1 = (Employee)o1;
			Employee e2 = (Employee)o2;
			return e1.getAge() > e2.getAge() ? 1 : (e1.getAge() == e2.getAge() ? 0 : -1);
		}
		
	};
	
	public static Comparator SALARY_SORT = new Comparator(){

		@Override
		public int compare(Object o1, Object o2) {
			// TODO Auto-generated method stub
			Employee e1 = (Employee)o1;
			Employee e2 = (Employee)o2;
			return e1.getSalary() > e2.getSalary() ? 1 : (e1.getSalary() == e2.getSalary() ? 0 : -1);
		}
		
	};

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		Employee e1 = new Employee("zhang", 20, 1111.1);
		Employee e2 = new Employee("zhang", 20, 1111.1);
		
		//等于号比较两个对象的地址
		if(e1 == e2){
			System.out.println("e1 == e2");
		}else{
			System.out.println("e1 != e2");
		}
		
		//Employee重写了该对象的equals方法,按照其成员变量进行一一比较
		if(e1.equals(e2)){
			System.out.println("e1.equals(e2)");
		}else{
			System.out.println("!e1.equals(e2)");
		}
		
		String[] nameArr = {"zhang", "li", "wang", "gao", "ma", "liu"};
		Employee[] employArr = new Employee[3];
		
		//随机产生三组Employee对象用来测试其比较大小的结果
		for (int i = 0; i < 3; i++){
			employArr[i] = new Employee(nameArr[new Random().nextInt(nameArr.length)],
					new Random().nextInt(30), 
					Double.parseDouble(String.format("%.1f", Math.random()*10000)));
		}

		System.out.println(Arrays.toString(employArr));
		
		System.out.println("=====Arrays=====");
		Arrays.sort(employArr);
		System.out.println(Arrays.toString(employArr));
		Arrays.sort(employArr, AGE_SORT);
		System.out.println(Arrays.toString(employArr));
		Arrays.sort(employArr, SALARY_SORT);
		System.out.println(Arrays.toString(employArr));
		
		System.out.println("=====MyArrays=====");
		MyArrays.sort(employArr);
		System.out.println(Arrays.toString(employArr));
		MyArrays.sort(employArr, AGE_SORT);
		System.out.println(Arrays.toString(employArr));
		MyArrays.sort(employArr, SALARY_SORT);
		System.out.println(Arrays.toString(employArr));
		
	}

}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值