Comparator和Comparable、compare的使用

比较器排序Comparator和Comparable的使用

简述Comparable和Comparator两个接口的区别。

compare是comparator里面的一个方法

  • Comparable:强行对实现它的每个类的对象进行整体排序。
    这种排序被称为类的自然排序,类的compareTo方法被称为它的自然比较方法。
    只能在类中实现compareTo()一次,不能经常修改类的代码实现自己想要的排序。
    实现此接口的对象列表(和数组)可以通过Collections.sort(和Arrays.sort)进行自动排序,对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。

  • Comparator强行对某个对象进行整体排序。
    可以将Comparator 传递给sort方法(如Collections.sort或Arrays.sort),从而允许在排序顺序上实现精确控制
    还可以使用Comparator来控制某些数据结构(如有序set或有序映射)的顺序,或者为那些没有自然顺序的对象collection提供排序

Int排序
@Test
	public void test1(){
		List<Integer> list = new ArrayList<Integer>();
		Collections.addAll(list, 57,112,35,5);
		System.out.println(list);
		//排序方法
		Collections.sort(list);
		System.out.println(list);
	}


/*
[57, 112, 35, 5]
[5, 35, 57, 112]
*/
String排序

public int compare(String o1, String o2) :比较其两个参数的顺序。

两个对象比较的结果有三种:大于,等于,小于。

  • 如果要按照升序排序, 则o1 小于o2,返回(负数),相等返回0,01大于02返回(正数)

  • 如果要按照降序排序 则o1 小于o2,返回(正数),相等返回0,01大于02返回(负数)

@Test
	public void test1(){
		List<String> list = new ArrayList<String>();
		list.add("cba");
		list.add("aba");
		list.add("bcd");
		list.add("nad");
		System.out.println(list);
		//排序方法
		Collections.sort(list, new Comparator<String>(){
			@Override
			public int compare(String o1, String o2) {
				return o2.charAt(0) - o1.charAt(0);
			}
		});
		System.out.println(list);
	}
/*
[cba, aba, bcd, nad]
[nad, cba, bcd, aba]
*/
对象排序

案例

需求说明:
根据学生年龄,找出班级中年龄最大与年龄最小的学生信息。

思路提示:
1、将学生类实现Comparable接口
2、重写compareTo方法,按照年龄进行比较
3、创建List集合并存储学生对象实例
4、调用max方法和min方法得到年龄最大与年龄最小的学生信息输出。

如果想要集合中的元素完成排序,那么必须要实现比较器Comparable接口。如果是对象的话,sort不能直接排序,需要在类那里实现Comparable<T>,然后重写compareTo方法

—学生类

package Day0817am;

public class Student implements Comparable<Student>{
	private String name;
	private int age;
	public Student() {
	}
	public Student(String name, int age){
		super();
		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 "Student [name=" + name + ", age=" + age + "]";
	}
	@Override
	public int compareTo(Student o) {
		//按照当前的类作为参照对象,与方法中传入的参数进行对比
		//如果返回值是正数,则表示大,为负数否则表示小,为0表示相等
		if(this.age>o.getAge()){
			return 1;
		}else if(this.age < o.getAge()){
			return -1;
		}else{
			return 0;
		}
	}
	
	
	

}

—测试类

@Test
	public void test2(){
		//实例化学生对象
		Student stu1 = new Student("张三1",18);
		Student stu2 = new Student("张三2",88);
		Student stu3 = new Student("张三3",78);
		Student stu4 = new Student("张三4",28);
		Student stu5 = new Student("张三5",8);
		
		List<Student> stus = new ArrayList<Student>();
		stus.add(stu1);
		stus.add(stu2);
		stus.add(stu3);
		stus.add(stu4);
		stus.add(stu5);
		
		System.out.println("---------排序前----------");
		for(Student s : stus){
			System.out.println(s);
		}
		System.out.println("-----------排序后----------");
		Collections.sort(stus);
		for(Student s : stus){
			System.out.println(s);
		}
		System.out.println("年龄最大的学生为:"+Collections.max(stus));
		System.out.println("年龄最小的学生为:"+Collections.min(stus));
		
	}
/*
---------排序前----------
Student [name=张三1, age=18]
Student [name=张三2, age=88]
Student [name=张三3, age=78]
Student [name=张三4, age=28]
Student [name=张三5, age=8]
-----------排序后----------
Student [name=张三5, age=8]
Student [name=张三1, age=18]
Student [name=张三4, age=28]
Student [name=张三3, age=78]
Student [name=张三2, age=88]
年龄最大的学生为:Student [name=张三2, age=88]
年龄最小的学生为:Student [name=张三5, age=8]

*/

如果在使用的时候,想要独立的定义规则去使用 可以采用Collections.sort(List list,Comparetor c)方式,自己定义规则:

Collections.sort(stus, new Comparator<Student>(){

			@Override
			public int compare(Student o1, Student o2) {
				//年龄降序
				result o2.getAge()-o1.getAge();
			}
		});
扩展

o2 - o1 :降序
o1 - o2 :升序

Collections.sort(stus, new Comparator<Student>(){

			@Override
			public int compare(Student o1, Student o2) {
				//年龄降序
				int result = o2.getAge()-o1.getAge();
				//如果年龄一样,就按照名字首字母升序排序
				if(result == 0){//第一个规则判断完了?下一个规则?姓名的首字母?升序
					result = o1.getName().charAt(0)-o2.getName().charAt(0);
				}
				return result;
			}
		});
@Test
	public void test1(){
		//实例化学生对象
		Student stu1 = new Student("张三1",18);
		Student stu2 = new Student("李三2",88);
		Student stu3 = new Student("王三3",18);
		Student stu4 = new Student("张三4",28);
		Student stu5 = new Student("张三5",8);
		
		List<Student> stus = new ArrayList<Student>();
		stus.add(stu1);
		stus.add(stu2);
		stus.add(stu3);
		stus.add(stu4);
		stus.add(stu5);
		
		System.out.println("---------排序前----------");
		for(Student s : stus){
			System.out.println(s);
		}
		System.out.println("-----------排序后----------");
		Collections.sort(stus, new Comparator<Student>(){

			@Override
			public int compare(Student o1, Student o2) {
				//年龄降序
				int result = o2.getAge()-o1.getAge();
				//如果年龄一样,就按照名字首字母升序排序
				if(result == 0){//第一个规则判断完了 下一个规则 姓名的首字母 升序
					result = o1.getName().charAt(0)-o2.getName().charAt(0);
				}
				return result;
			}
		});
		for(Student s : stus){
			System.out.println(s);
		}
	}
/*
---------排序前----------
Student [name=张三1, age=18]
Student [name=李三2, age=88]
Student [name=王三3, age=18]
Student [name=张三4, age=28]
Student [name=张三5, age=8]
-----------排序后----------
Student [name=李三2, age=88]
Student [name=张三4, age=28]
Student [name=张三1, age=18]
Student [name=王三3, age=18]
Student [name=张三5, age=8]

*/

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