外部比较器---排序

外部比较器

外部比较器可以说是内部比较器的加强版,它在封装类的外面可以定义多个类来对不同的功能进行实现,如果说是内部比较器的话,重写方法,只能返回一个值,如果说有多个功能实现的话会比较麻烦。如果使用外部比较器就可以定义可能会需要的功能程序,实现起来就会相对来说简单很多。
第一步,定义排序代码实现图示:
1
源码+注释展示:

//定义一个排序方法,需要用到的时候直接在其他主方法直接调用即可
		public static void sort(Object[] arr,Comparator com){//定义一个排序方法
			for (int i = 1; i <= arr.length-1; i++) {//对数组进行遍历,定义数组比较的两个元素
				for (int j = i; j <= arr.length-1; j++) {					
					if (com.compare(arr[i-1], arr[j])>0) {//如果前面一个值大于后面一个值,那么将会执行下面的操作,否则不执行里面的语句
						Object temp = arr[i-1];//在这里主要执行的是一个交换的工作,数组大的往后放,小的往前
						arr[i-1] = arr[j];//将小的值给到i-1
						arr[j] = temp;//最后完成交换
					}
				}
			}
		}

第二步,定义一个封装类,然后使用外部排序的方法实现多个功能的实现,在需要用到要用的功能时直接进行new对象即可进行使用。图示如下:
1
2
3
正如上图所示,在封装类的外部实现接口Comparator,然后进行功能实现的程序设计。
源码+注释:

import java.util.Comparator;
public class Student{//实现compareTo接口
	private String name;
	private int age;
	private double score;
	
	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;
	}
	public double getScore() {
		return score;
	}
	public void setScore(double score) {
		this.score = score;
	}
	public Student(String name, int age, double score) {
		super();
		this.name = name;
		this.age = age;
		this.score = score;
	}
	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + ", score=" + score + "]";
	}
}
class Campare implements Comparator{//表示的是该类实现接口Comparator,需要进行重写

	@Override
	public int compare(Object o1, Object o2) {
		Student s1=(Student)o1;
		Student s2=(Student)o2;
		return s1.getAge()-s2.getAge();
	}
}
//对名字进行排序
class Campare01 implements Comparator{//表示的是该类实现接口Comparator,需要进行重写

	@Override
	public int compare(Object o1, Object o2) {
		Student s1=(Student)o1;
		Student s2=(Student)o2;
		return s1.getName().compareTo(s2.getName());
	}
}	

第三步,主程序中定义对象并进行对对象进行赋值,进行对需要使用的对象进行new,然后调用排序的方法,并打印其所需的内容:
4
源码+注释展示:

import java.util.Arrays;

public class Test {
	public static void main(String[] args) {	
		Student s = new Student("Tom",15,63);//定义对象并进行赋值
		Student s1 = new Student("Je",14,59);
		Student s2 = new Student("TomSun",16,56.7);
		Student[] student = new Student[4];
		student[0] = s;
		student[1] = s1;
		student[2] = s2;
		student[3] = new Student("Join",13,65);
		//按照年龄进行比较 从小到大
		Campare cap = new Campare();
		ArraysUntil.sort(student,cap);
		System.out.println(Arrays.toString(student));
	}
}

为了节省代码,我们还可以在主程序当中定义一个匿名内部类,其他不变,就是增加了一个匿名内部类。图示如下:
1
2
在上图中我们可以发现,注释掉得内部类与下面的是一样的,上面的只是为了理解,那样会更清晰,意思一样。只是上面一个看起来会更清晰。如下图示:
3
源码展示:

package Test02;

import java.util.Arrays;
import java.util.Comparator;

public class Test {//外部比较器
	public static void main(String[] args) {	
		Student s = new Student("Tom",15,63);//定义对象并进行赋值
		Student s1 = new Student("Je",14,59);
		Student s2 = new Student("TomSun",16,56.7);
		Student[] student = new Student[4];
		student[0] = s;
		student[1] = s1;
		student[2] = s2;
		student[3] = new Student("Join",13,65);
		//按照年龄进行比较 从小到大
//		Campare cap = new Campare();
//		Campare01 cap = new Campare01();
		//定义一个匿名内部类
//		Comparator com = new Comparator() {
//
//			@Override
//			public int compare(Object o1, Object o2) {//对成绩进行排序
//				Student s1=(Student)o1;
//				Student s2=(Student)o2;
//				return ((Double)s1.getScore()).compareTo((Double)s2.getScore());//将其转成对应的包装类
//			}
//			
//		};
		ArraysUntil.sort(student,new Comparator() {

			@Override
			public int compare(Object o1, Object o2) {//对成绩进行排序
				Student s1=(Student)o1;
				Student s2=(Student)o2;
				return ((Double)s1.getScore()).compareTo((Double)s2.getScore());//将其转成对应的包装类
			}
			
		});
		System.out.println(Arrays.toString(student));
	}
}

结束语:外部比较器会更方便,当然有时候内部比较器也有它的优点,两者之间的关系很紧密,两者之间的实现是差不多的。


版权声明:本文为qq_43310845原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。