为什么要使用Java比较器
在平时的情况下,对象之间一般只存在 == 或者 ! = 关系,无法比较二个对象之间的大小。当如果在实际开发中,需要比较对象之间的某一个属性之间的大小,那么我们就可以使用到Java中的比较器。
Java中二种比较器
- 自然排序 :Comparable
- 定制排序 :Comparator
自然排序 :Comparable的使用
- 对象实现Comparable接口,并重写compareTo 方法
- 重写compareTo 的规则
如果当前对象this大子形参对象obj,则返回正整数,
如果当前对象this小于形参对象obj,则返回负整数,
如果当前对象this等于形参对象obi,则返回零。. - 举例 : 比如有一个商品类,商品类中存在二个属性,name 和 price,其中在多件商品中需要根据该商品的price进行从小到大的顺序进行排序
商品类
public class Goods implements Comparable
{
private String name;
private int price;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public int getPrice()
{
return price;
}
public void setPrice(int price)
{
this.price = price;
}
@Override
public String toString()
{
return "Goods{" +
"name='" + name + '\'' +
", price=" + price +
'}';
}
public Goods()
{
}
public Goods(String name, int price)
{
this.name = name;
this.price = price;
}
// 指定按照什么大小进行排序 ,比如按照价格从滴到高
@Override
public int compareTo(Object o)
{
if(o instanceof Goods){ //
Goods goods= (Goods) o;
if(this.price > goods.price){
return 1;
}else if (this.price < goods.price){
return -1;
}else {
return 0;
}
}else {
throw new RuntimeException("二者类型不一致");
}
}
}
测试代码 如果该商品类不实现Comparable接口重写compareTo方法那在运行的时候会抛出 cannot be cast to java.lang.Comparable 异常信息
@Test
public void CompareTest1()
{
Goods[] goods = new Goods[4];
goods[0] = new Goods("ip7", 3500);
goods[1] = new Goods("ip8", 4500);
goods[2] = new Goods("ip6", 2500);
goods[3] = new Goods("ipx", 5500);
Arrays.sort(goods);
System.out.println(Arrays.toString(goods));
}
定制排序 :Comparator
- 不需要实现该接口
- 创建匿名接口进行使用
@Test
public void CompareTest3()
{
Goods[] goods = new Goods[5];
goods[0] = new Goods("ip7", 3500);
goods[1] = new Goods("ip8", 4500);
goods[2] = new Goods("ip6", 2600);
goods[4] = new Goods("ip6", 2500);
goods[3] = new Goods("ipx", 5500);
Arrays.sort(goods, new Comparator()
{
@Override
public int compare(Object o1, Object o2)
{
if(o1 instanceof Goods && o2 instanceof Goods){
Goods goods1 = (Goods) o1;
Goods goods2 = (Goods) o2;
if(goods1.getName().equals(goods2.getName())){ // 如果名字是一样的 那就按照价格从低到高进行排序
return Double.compare(goods1.getPrice(),goods2.getPrice());
}else{
return goods1.getName().compareTo(goods2.getName());
}
}
throw new RuntimeException("类型不一致");
}
});
System.out.println(Arrays.toString(goods));
}
来源:CSDN
作者:qq_2974743696
链接:https://blog.csdn.net/qq_44892091/article/details/103698415