编程语言
首页 > 编程语言> > Java 比较器 Comparable、Comparator

Java 比较器 Comparable、Comparator

作者:互联网

Java比较器

1.自然排序:Comparable

1.1 Comparable接口

public interface Comparable<T> 
{
    public int compareTo(T o);
}

1.2 Comparable 的典型实现

注:以下实现默认都是从小到大排列

1.String举例
String []arr=new String[]{"aa","C","ad"};
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));//[C, aa, ad]

2.Integer举例
Integer []arr=new Integer[] {1,6,4,2};
Arrays.sort(arr);
System.out.println(Arrays.toString(arr)); //[1, 2, 4, 6]

1.3 自定义类实现Comparable接口

// 自定义手机类,拥有name、price属性。
// compareTo方法具体实现:对price进行升序排序,price相同时对name进行降序排序

public class SmartPhone implements Comparable
{
	String name;
	double price;
	
	public SmartPhone(String name, double price)
	{
		this.name = name;
		this.price = price;
	}

	@Override
	public String toString()
	{
		return "SmartPhone [name=" + name + ", price=" + price + "]";
	}

	@Override
	public int compareTo(Object o)
	{
		if(o instanceof SmartPhone)
		{
			SmartPhone sp=(SmartPhone)o;
			if(this.price>sp.price)
				return 1;
			else if(this.price<sp.price)
				return -1;
			else//此时说明二者price相同 (然后按照name降序)
			{
				return -this.name.compareTo(sp.name); //String 本来是升序,-表示将升序转换为降序
			}
		}
		throw new RuntimeException("请传入正确数据类型");
	}
}

@Test
public void SmartPhoneTest()
{
		SmartPhone []arr=new SmartPhone[5];
		arr[0]=new SmartPhone("XiaoMi",  3999);
		arr[1]=new SmartPhone("HuaWei",  4999);
		arr[2]=new SmartPhone("OPPO"  ,  3299);
		arr[3]=new SmartPhone("OnePlus", 3999);
		arr[4]=new SmartPhone("iphone",  4999);

		Arrays.sort(arr);
		System.out.println(Arrays.toString(arr));
}
// 输出
[
SmartPhone [name=OPPO, price=3299.0], 
SmartPhone [name=XiaoMi, price=3999.0],
SmartPhone [name=OnePlus, price=3999.0],
SmartPhone [name=iphone, price=4999.0], 
SmartPhone [name=HuaWei, price=4999.0]
]

2.定制排序:Comparator

2.1 Comparator 接口

public interface Comparator<T> 
{
    int compare(T o1, T o2);
    boolean equals(Object obj);
}

2.2 重写compare(T o1,T o2)使String 降序排列

String []arr=new String[]{"aa","C","ad"};
Arrays.sort(arr, new Comparator()
{
	@Override
	public int compare(Object o1, Object o2)
	{
		if(o1 instanceof String && o2 instanceof String)
		{
			String str1=(String)o1;
			String str2=(String)o2;
			return -str1.compareTo(str2);
		}
		throw new RuntimeException("请传入正确数据类型");
	}
});
System.out.println(Arrays.toString(arr));//[ad, aa, C]

3.Comparable、Comparator区别

4. 关于Comparable接口的一点说明

为什么使用Arrays排序的对象都要实现Comparable接口。能否直接在类中定义一个 compareTo 方法?

不能。因为 Arrays.sort(Object[] objs ) 内部必须把Object数组里面强制转换为Comparable类型,才可以调用comparaTo()方法。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

标签:arr,SmartPhone,Java,String,Comparator,price,Comparable,name
来源: https://blog.csdn.net/weixin_43956248/article/details/113695764