比较器问题

比较器

所谓的比较器指的就是进行大小关系的确定判断

1、比较器问题的引出

如果要进行数组操作,肯定使用java.util.Arrays的操作类完成,这个类里面提供有绝大部分的数组操作支持,同时这个类里面还提供有一种对象数组的排序支持:public static void sort(Object[] a)

范例:实现对象数组的排序

public class JavaAPIDemo {
	public static void main(String[] args) throws ParseException {
		Integer data[]  = new Integer[]{10, 9, 5, 2, 20};   //对象数组
		Arrays.sort(data);	//进行对象数组的排序
        System.out.println(Arrays.toString(data));
	}
}

如果说现在给定一个是String类型的对象数组。那么也是可以进行排序处理的

范例:String对象数组排序

public class JavaAPIDemo {
	public static void main(String[] args) throws ParseException {
		String data[]  = new String[]{"X", "B", "F", "A", "G"};   //对象数组
		Arrays.sort(data);
		System.out.println(Arrays.toString(data));
	}
}
//结果:[A, B, F, G, X]

java.lang.Integer与java.lang.String两个类都是由系统提供的程序类。那么有一个自定义的类需要实现排序处理呢

范例:采用自定义类型进行排序

class Person{
	private String name;
	private int age;
	
	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}
	//setter getter略
	
	@Override
	public String toString() {
		return "Person{" +
				"name='" + name + '\'' +
				", age=" + age +
				'}';
	}
}

public class JavaAPIDemo {
	public static void main(String[] args) throws ParseException {
		Person person [] = new Person []{
				new Person("A" , 80),
				new Person("B" , 60),
				new Person("C" , 100),
		};
		Arrays.sort(person);
		System.out.println(Arrays.toString(person));
	}
}

结果产生了运行时异常:

class cn.mldn.demo.Person cannot be cast to class java.lang.Comparable 

任意的一个类默认情况下是无法使用系统内部的类进行数组排序或比较需求的,是因为没有明确的指定出到底该如何比较的定义(没有比较规则),那么这个时候在Java里面为了统一比较的规则的定义,所以提供有比较器的接口:Comparable接口

2、Comparable比较器

通过分析可以发现如果要实现对象的比较肯定需要有比较器来制定比较规则,而比较的规则可以通过Comparable来实现。对于Comparable而言,需要清楚基本的定义结构:

interface ComParameter<T>{
   /**
    * 实现对象的比较处理操作
    * @param o 要比较的对象
    * @return 当前数据比传入的对象小返回负数,如果大返回正数,等于返回0
    */
   public int compareTo(T o);
}

范例:实现自定义对象数组排序

class Person implements Comparable<Person>{
   private String name;
   private int age;
   
   public Person(String name, int age) {
      this.name = name;
      this.age = age;
   }
   //setter getter略
   
   @Override
   public String toString() {
      return "Person{" +
            "name='" + name + '\'' +
            ", age=" + age +
            '}';
   }
   
   @Override
   public int compareTo(Person o) {
      return age - o.age;
   }
}

public class JavaAPIDemo {
   public static void main(String[] args) throws ParseException {
      Person person [] = new Person []{
            new Person("A" , 80),
            new Person("B" , 60),
            new Person("C" , 100),
      };
      Arrays.sort(person);
      System.out.println(Arrays.toString(person));
   }
}

排序里面只需要有一个compareTo()的方法进行排序规则的定义,而后整个Java系统里面就可以为其实现排序处理了

3、Comparator比较器

Comparator属于一种挽救的比较器支持,其主要的目的是解决一些没有使用Comprarable数组排序

范例:现在程序项目已经开发完成了,并且由于先期的设计没有去考虑到所谓的比较器功能

class Person {
   private String name;
   private int age;
   
   public Person(String name, int age) {
      this.name = name;
      this.age = age;
   }
   //setter getter略
   
   @Override
   public String toString() {
      return "Person{" +
            "name='" + name + '\'' +
            ", age=" + age +
            '}';
   }
}

后来经过了若干版本的迭代更新之后发现需要对Person类进行排序处理,但是又不能修改Person类(无法实现Comparable),所以这个时候就需要采用一种挽救的形式来实现比较,在Arrrays类里面排序有另外一种实现:

  • 排序处理:public staic void sort(T[] a , Comparator<? super T> c)

在java.util.Comparator里面最初只定义有一个排序的compare()方法(public int compare(T o1 , T o2)),但后来持续发展又出现了许多的static的方法

范例:定义排序规则类

public class JavaAPIDemo {
   public static void main(String[] args) throws ParseException {
      Person[] person = new Person []{
            new Person("A" , 80),
            new Person("B" , 60),
            new Person("C" , 100),
      };
      Arrays.sort(person , new PersonComparator());
      System.out.println(Arrays.toString(person));
   }
}
class PersonComparator implements Comparator<Person> {
   
   @Override
   public int compare(Person p1 , Person p2) {
      return p1.getAge() - p2.getAge();
   }
}
class Person {
   private String name;
   private int age;
   
   public Person(String name, int age) {
      this.name = name;
      this.age = age;
   }
   
   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;
   }
   
   @Override
   public String toString() {
      return "Person{" +
            "name='" + name + '\'' +
            ", age=" + age +
            '}';
   }
}

对于这种排序的操作如果不是必须的情况下强烈不建议使用Comparator,最好以Comparable为主

面试题:请解释Comparable与Comparator的区别

  • java.lang.Comparable是在类定义的时候实现的父接口,主要用于定义排序规则,里面只有一个compareTo()的方法
  • java.util.Comparator是挽救在比较器的操作,需要设置单独的比较器规则类实现排序,里面有compare()方法

下一篇:二叉树的实现

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MyRedScarf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值