Java(44):Comparable 接口 与 Comparator 接口的使用与比较

版权声明: https://blog.csdn.net/qq_29166327/article/details/82878041

2018年09月28日

目录

1.Comparable接口的概念

2、Comparable接口使用

2.1 新建类 Age.java ,implements 接口,重写compareTo() 方法:

2.2 测试Demo:ComparableTest.java

3、Comparator 接口的概念

4、Comparator接口的使用

4.1 新建比较器类AgeComparator,实现 Comparator接口,重写compare()方法:

4.2 测试Demo:ComparatorTest.java


1.Comparable接口的概念

此接口强行对实现它的每个类的对象进行整体排序。此排序被称为该类的自然排序 ,类的 compareTo 方法被称为它的自然比较方法 。实现此接口的对象列表(和数组)可以通过 Collections.sort (和 Arrays.sort )进行自动排序。实现此接口的对象可以用作有序映射表中的键或有序集合中的元素,无需指定比较器。 

2、Comparable接口使用

2.1 新建类 Age.java ,implements 接口,重写compareTo() 方法:

class Age implements Comparable<Age>{
	private int num ;

	public Age(int num) {
		super();
		this.num = num;
	}

	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}

	@Override
	public int compareTo(Age o) {
		//逆序还是降序,只要把两者的属性进行相减位置调换即可;
		//-1 0 1 如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。 
//		return this.num - o.getNum(); //升序
		return o.getNum() - this.num ;//降序 (主动权在下一个,结果>0,排前面;<0,排后面;)
	}
	
}

2.2 测试Demo:ComparableTest.java

public class ComparableTest {

	public static void main(String[] args) {		
		Age[] ageList = new Age[]{new Age(4),new Age(3),new Age(2),new Age(1)};		
		System.out.println("1: "+getList(ageList));
		Arrays.sort(ageList);
		System.out.println("2: "+getList(ageList));		
	}
	
	private static String getList(Age[] ageList){
		StringBuffer stringBuffer = new StringBuffer();
		//根据数组的长度创建一个长度相同的List,
		//然后通过Collections.addAll()方法,将数组中的元素转为二进制,
		//然后添加到List中,这是最高效的方法。
		List<Age> arrayList = new ArrayList<Age>(ageList.length);
		Collections.addAll(arrayList, ageList);
		for(Age age : arrayList){
			stringBuffer.append(String.valueOf(age.getNum()+" "));
		}
		return stringBuffer.toString();
	}
}

输出结果:

【逆序】

1: 4 3 2 1 
2: 4 3 2 1 

【升序】 

1: 4 3 2 1 
2: 1 2 3 4 

3、Comparator 接口的概念

对任意类型集合对象进行整体排序,排序时将此接口的实现传递给Collections.sort方法或者Arrays.sort方法排序. 
实现int compare(T o1, T o2);方法,返回正数,零,负数各代表大于,等于,小于。

4、Comparator接口的使用

4.1 新建比较器类AgeComparator,实现 Comparator接口,重写compare()方法:

class AgeComparator implements Comparator<Age>{

	@Override
	public int compare(Age o1, Age o2) {
//		return o1.getNum() - o2.getNum(); //升序
		return o2.getNum() - o1.getNum(); //逆序
	}
	
}

4.2 测试Demo:ComparatorTest.java

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class ComparatorTest {

	public static void main(String[] args) {		
		Age[] ageList = new Age[]{new Age(4),new Age(3),new Age(2),new Age(1)};		
		System.out.println("1: "+getList(ageList));
		Arrays.sort(ageList, new AgeComparator());
		System.out.println("2: "+getList(ageList));
		
	}
	
	private static String getList(Age[] ageList){
		StringBuffer stringBuffer = new StringBuffer();
		//根据数组的长度创建一个长度相同的List,
		//然后通过Collections.addAll()方法,将数组中的元素转为二进制,
		//然后添加到List中,这是最高效的方法。
		List<Age> arrayList = new ArrayList<Age>(ageList.length);
		Collections.addAll(arrayList, ageList);
		for(Age age : arrayList){
			stringBuffer.append(String.valueOf(age.getNum()+" "));
		}
		return stringBuffer.toString();
	}
}

输出结果:

1、升序:

1: 4 3 2 1 
2: 1 2 3 4 

2、逆序:

1: 4 3 2 1 
2: 4 3 2 1 

猜你喜欢

转载自blog.csdn.net/qq_29166327/article/details/82878041