Java基础-比较器简单应用

比较器简单应用

Comparable和Comparator的简单使用:
如果对象数组需要排序,那么就必须设置排序规则,就要使用这两种比较器

  1. 对于Comparable接口来说,它往往是进行比较类需要实现的接口,它仅包含一个有compareTo()方法,只有一个参数,返回值为int,返回值大于0表示对象大于参数对象;小于0表示对象小于参数对象;等于0表示两者相等,Comparable接口一般用于我们自己写的类或者是是可以实现接口的对象类中。

  2. 对于Comparator接口来说,它的实现者被称为比较器,它包含一个compare()方法,有两个参数,返回值与Comparable的compareTo()方法一样,不同之处是Comparator接口一般不会被集合元素类所实现,而是单独实现或者匿名内部类方式实现,Comparator接口一般用于系统自己的类中,我们不能随意的继承接口和复写方法。

实例:
文件结构:

  1. Person.java为我们自己的类实现Comparable接口复写CompareTo方法;
  2. Dog.java假定为系统的类不能随意实现接口和复写方法;
  3. MyCompare.java为Comparator接口的类,并且复写Compare方法;
  4. Test1.java为主方法。

Person.java

public class Person implements Comparable<Person>{//加入了泛型(<Person>)
	//自己写的类,可以实现接口,所以用Comparable接口复写compareTo方法实现比较
	public  String name;
	public int age;
	public Person(String name,int age){
		super();
		this.name = name;
		this.age = age;
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
	
	@Override
	public int compareTo(Person o) {//加入泛型后,不需要对object类进行强转为person类
		if(this.age > o.age){
			return 1;
		}
		if(this.age < o.age){
			return -1;
		}
		return name.compareTo(o.name);//调用了javaLong包关于string的compareable的比较
	}

	
//	@Override
//	public int compareTo(Object o) {// 加入泛型前 //比较器接口
//		/*
//		  比较器规则 
//		 	如果返回正整数 则表示调用对象要大于参数对象
//		 	如果返回负整数 则表示调用对象要小于参数对象 
//		 	如果返回0	   则表示调用对象等于参数对象
//		 */
//		Person person = (Person)o;//强制转换将object类强转成为person类
//		if(this.age > person.age){
//			return 1;
//		}
//		if(this.age < person.age){
//			return -1;
//		}
//		return name.compareTo(person.name);//调用了javaLong包关于string的compareable的比较
//	}
}

Dog.java

public class Dog {//当做是系统的类不可以随意实现接口
	//用Comparator接口复写compare方法实现比较
	public String name;
	public int age;
	public Dog(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	@Override
	public String toString() {
		return "Dog [name=" + name + ", age=" + age + "]";
	}

}

MyCompare.java

public class MyCompare implements Comparator<Dog>{
	/*
	 (non-Javadoc)
	 @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
	  
	 比较的数据类是系统的类那么无法修改代码实现对  Comparable接口compareTo方法的复写
	那么就需要复写Comparator接口compare方法来实现对系统类数据的排序
	 
	 */
	@Override
	public int compare(Dog o1, Dog o2) {
		if(o1.age > o2.age){
			return 1;
		}
		if(o1.age < o2.age){
			return -1;
		}
		return o1.name.compareTo(o2.name);
	}

}

Test1.java

public class Test1 {
	/*
	 1.对象数组的排序必须实现比较器接口(Comparable/Comparator)
	 自己定义比较规则
	 
	 Comparable接口复写compareTo方法
	 
	 比较器规则 
	 	如果返回正整数 则表示调用对象要大于参数对象
	 	如果返回负整数 则表示调用对象要小于参数对象 
	 	如果返回0	   则表示调用对象等于参数对象
	 
	 sort方法再给对象数组排序时,自动调用元素的compareTo方法,如果该对象没有实现比较器接口,则内部代码强转报错
	 
	 2.如果对象数组里面的对象对应的类不是我们自己定义的呢?
	 	比如 math等系统自己写的类,不能改代码
	 	那就要使用另外一个比较器接口
	 		实现Comparator接口复写Compare方法
	 
	 
	 
	 */
	public static void main(String[] args) {//系统的类
		//Comparator接口的实现类比较
		Dog[] dogs = {new Dog("aab", 5),new Dog("aac", 5),new Dog("abc", 6),new Dog("acc", 8)};
		Arrays.sort(dogs, new MyCompare());
		System.out.println(Arrays.toString(dogs));
	}
	
	public static void main1(String[] args) {//自己的类
		//Comparable接口的实现类比较
		Person[] persons = {new Person("abc", 13),
				new Person("qwe", 14),
				new Person("rty", 18),
				new Person("uio", 16),
				new Person("opq", 15),};
		Arrays.sort(persons);
		System.out.println(Arrays.toString(persons));
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值