Java中的比较器(Comparable 和 Comparator)

自然排序:

java.long.Comparable

1.Comparable接口的使用

  • String、包装类 是实现了Comparable接口的,所以String是可以比较大小的
  • 默认是从小到大进行排序(升序)

2.自定义类实现Comparable接口

  • 需要排序时,要实现Comparable接口,重写compareTo().之后就可以使用Arrays.sort(Object obj)
  • 重写comparableTo(obj) 方法的规范:
    1. 当前this大于obj那么返回正整数
    2. 当前this小于obj那么返回负整数
    3. 当前this等于obj那么返回0

3.特点:

  • 多次使用
import java.util.Arrays;

public class ComparableTest {
	public static void main(String[] args) {
		ComparableTest comparableTest = new ComparableTest();
		comparableTest.test1();
		
		System.out.println("-------------------------------------------------");
		
		Customize[] watch = new Customize[4];
		watch[0]= new Customize("Apple Watch",2350);
		watch[1]= new Customize("Mi Watch",1010);
		watch[2]= new Customize("Oppo Watch",2100);
		watch[3]= new Customize("HuaWei Watch",2500);
		
		//自定义类需要排序时,要实现Comparable接口,重写compareTo()
		Arrays.sort(watch); //排序
		for (int i = 0; i < watch.length; i++) {
			System.out.println(watch[i].toString());
		}
		
	}
	
	//String 是实现了Comparable接口的,所以String是可以比较大小的
	public void test1() {
		String[] arr = new String[] {"bb","uu","t","jj","www","aa"};
		System.out.println("排序前:"+Arrays.toString(arr));
		Arrays.sort(arr); //排序
		System.out.println("默认升序排序后:"+Arrays.toString(arr));
	}
}
class Customize implements Comparable{
	private String name;
	private double price;
	public Customize() {
		super();
	}
	public Customize(String name, double price) {
		super();
		this.name = name;
		this.price = price;
	}
	@Override
	public String toString() {
		return "[name=" + name + ", price=" + price + "]";
	}

	@Override
	//自定义类 要实现Comparable接口,重写compareTo()
	public int compareTo(Object o) {
		if (o instanceof Customize) {
			Customize goods = (Customize) o;
			if (this.price > goods.price) {
				return 1;
			} else if (this.price < goods.price) {
				return -1;
			} else {
				return 0;
			} 
		}
		throw new RuntimeException("obj not instanceof Customize");
		/* 或者
		return Double.compare(this.price, goods.price);  升序
		return -Double.compare(this.price, goods.price); 降序
		*/
	}
}

在这里插入图片描述

定制排序:

java.util.Comparator
Comparator接口的使用:
1.适用条件

  • 当元素的类型没有实现java.long.Comparable接口,但是又不方便改代码(例如:java中内嵌的API)
  • 实现了java.long.Comparable接口,但是排序的规则不适合当前的操作

2.Comparator接口的使用

  • 重写compare(Object o1,Object o2)方法,比较o1和o2的大小
  • 规范:
    1. o1大于o2那么返回正整数
    2. o1小于o2那么返回负整数
    3. o1等于o2那么返回0

3.特点

  • 一次性使用
import java.util.Arrays;
import java.util.Comparator;

public class ComparatorTest {
	public static void main(String[] args) {
		ComparatorTest c1 = new ComparatorTest();
		c1.test2();
		
		System.out.println("**************************************");
		
		Customize2[] watch = new Customize2[4];
		watch[0]= new Customize2("Apple Watch",2350);
		watch[1]= new Customize2("Mi Watch",1010);
		watch[2]= new Customize2("Oppo Watch",2100);
		watch[3]= new Customize2("HuaWei Watch",2500);
		//自定义类使用 Comparator接口
		Arrays.sort(watch, new Comparator() {
			@Override
			public int compare(Object o1, Object o2) {
				if(o1 instanceof Customize2 && o1 instanceof Customize2) {
					Customize2 goods1 = (Customize2)o1;
					Customize2 goods2 = (Customize2)o2;
					return - Double.compare(goods1.getPrice(),goods2.getPrice()); //降序
				}
				throw new RuntimeException("o1 not instanceof Customize2 or o2 not instanceof Customize2");
			}
		});
		for (int i = 0; i < watch.length; i++) {
			System.out.println(watch[i].toString());
		}
	}
	
	public void test2() {
		String[] arr = new String[] {"bb","uu","t","jj","www","aa"};
		System.out.println("排序前:"+Arrays.toString(arr));
		Arrays.sort(arr, new Comparator(){ //Comparator接口的使用
			@Override
			public int compare(Object o1, Object o2) {//重写compare(Object o1,Object o2)方法
				if(o1 instanceof String && o2 instanceof String) {
					String s1 = (String)o1;
					String s2 = (String)o2;
					return -s1.compareTo(s2); //降序
				}
				throw new RuntimeException("o1 not instanceof String or o2 not instanceof String");
			}
		});
		System.out.println("自定义降序排序后:"+Arrays.toString(arr));
	}
}

class Customize2 {
	private String name;
	private double price;
	public Customize2() {
		super();
	}
	public Customize2(String name, double price) {
		super();
		this.name = name;
		this.price = price;
	}
	
	public double getPrice() {
		return price;
	}
	@Override
	public String toString() {
		return "[name=" + name + ", price=" + price + "]";
	}
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值