Comparator 和Comparable的总结比较

一:基本介绍
List集合对元素排序的方法有两种
1.元素自己实现了Comparable接口 实现了一个自然排序(自己比较完成的)直接添加进集合就是排好顺序的。

2.我们通过传入实现了一个Comparator接口实现一个排序(外部程序比较实现)。我们定义一个比较器,然后把这个比较器传入进去

 Collections.sort(list,new X());
 Set<Integer> set=new TreeSet<>(new TP());
 其中 new x(),new TP()就是一个比较器对象。

它们的区别有三点:

1.存在包结构不同:
java.lang.Comparable 语言基础包
java.util.Comparator 工具包

2.当中的抽象方法不同:
Comparable compareTo(1)
Comparator compare(1,2)

最重要的是它们的语境 语义完全不同
Comparable adj.形容词
有能力去比较的
Comparator n.名词
比较专用的工具 比较器

一个类实现了Comparable接口就代表这个类的对象
是有比较排序的能力的
可以直接放进TreeSet集合当中
实现该接口的类的对象自动拥有排序功能
如果a > b,int>0;如果a=b,int=0;如果a<b,int<0。

一个类实现了Comparator接口就代表这个类的对象
是用来比较另一种对象的工具而已
它应该在TreeSet构造方法当中传参

https://blog.csdn.net/u012250875/article/details/55126531

二:代码使用案例

Comparator

import java.util.*;
public class ExecComparator{
	public static void main(String[] args){
		List<Book> list = new ArrayList<>();
		Book bk1 = new Book("CoreJava",132);
		Book bk2 = new Book("Thinking in Java",98);
		Book bk3 = new Book("Effective Java",60);
		Collections.addAll(list,bk1,bk2,bk3);
		//请将书籍按照名字字母顺序排序

		//Collections.sort(list,new X());
		Collections.sort(list,new X());

		//list.forEach(System.out::println);//jdk8 lambda
		list.forEach((x) -> System.out.println("这本书叫:"+x));

		list.stream().filter(x -> x.name.startsWith("C")).forEach(System.out::println);

		/*
		for(Book bk : list){
			if(bk.name.startsWith("C")){
				System.out.println(bk);
			}
		}
		*/

	}
}
class X implements Comparator<Book>{
	@Override
	public int compare(Book b1,Book b2){
		return b1.name.compareTo(b2.name);
	}
}
class Book {
	String name;
	int price;
	public Book(String name,int price){
		this.name = name;
		this.price = price;
	}
	@Override
	public String toString(){
		return name + " : " + price;
	}
}
import java.util.*;
public class TestComparator{
	public static void main(String[] args){
		 Set<Integer> set=new TreeSet<>(new TP());
		Collections.addAll(set,55,33,11,44,22);
		System.out.println(set);
	}
}
class TP implements Comparator<Integer>{
	@Override
	public int compare(Integer i1,Integer i2){
		return i2 - i1;
	}
}

Comparable

import java.util.*;
public class Exec4{
	public static void main(String[] args){
		TreeSet<Ball> set = new TreeSet<>();
		Ball b1 = new Ball(4,"红色");
		Ball b2 = new Ball(1,"黄色");
		Ball b3 = new Ball(9,"灰色");
		Collections.addAll(set,b1,b2,b3);
		//[1:黄色,4:红色,9:灰色]
		System.out.println(set);
	}
}
/**
	实现:implements
	接口:Comparable<泛型>
	方法:compareTo(泛型 x) -> int
	按照球号升序排序
*/
class Ball implements Comparable<Ball>{
	int number;
	String color;

	public Ball(int number,String color){
		this.number = number;
		this.color = color;
	}

	@Override
	public int compareTo(Ball b1){
		Ball x1 = this;
		Ball x2 = b1;

		int n1 = x1.number;
		int n2 = x2.number;

		return n1 - n2;//新元素 - 老元帅 -》 升序

		//return n2 - n1;//老元素 - 新元素 -》 降序

	}

	@Override
	public String toString(){
		return number + ":" + color;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值