当前位置:网站首页>比较器(Comparable与Comparator接口)
比较器(Comparable与Comparator接口)
2022-07-26 10:31:00 【一尾流鸢cd】
有错之处,希望大家可以指出来,谢谢。
文章目录
概念
比较器:对两个或多个数据进行比较,以确定它们是否相等,或确定他们之间的大小关系以及排列顺序(来自于百度)。
Java中的比较器主要是通过实现Comparable与Comparator两个接口来实现的
Comparable接口
通过类继承接口,在类中对CompareTo()方法进行复写完成比较
主要实现语句:
类+implements Comparable<>{
…
public int compareTo(Work o){
return 0;
}
}
比较方法:
通过if(){}else{}语句进行判断返回值是-1,1,0中的哪一个,使用时通过返回的是-1,1,0来对比较者进行顺序的排列。
Comparable接口实现注意:接口的实现位置要在类所在的位置,比如此类是Worker类那么Comparable接口要在Worker类中实现。
例如:
public class Worker implements Comparable<Worker> {
......
......
public int compareTo(Worker o) {
if (this.salary <o.salary) {
return 1;
} else if (this.salary>o.salary) {
return -1;
} else {
//如果第一个条件相等,的比较第二个条件
if (this.age > o.age) {
return 1;
} else if (this.age < o.age) {
return -1;
} else{
return 0;
}
}
}
Comparable接口实例:
public class Worker implements Comparable<Worker> {
//public class Worker {
private String name;
private int age;
private float salary;
public Worker(String name, int age, float salary) {
this.name = name;
this.age = age;
this.salary = salary;
}
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 float getSalary() {
return salary;
}
public void setSalary(float salary) {
this.salary = salary;
}
@Override
public String toString() {
return "Worker{" +
"name='" + name + '\'' +
", age=" + age +
", salary=" + salary +
'}';
}
@Override
public int compareTo(Worker o) {
if (this.salary <o.salary) {
return 1;
} else if (this.salary>o.salary) {
return -1;
} else {
if (this.age > o.age) {
return 1;
} else if (this.age < o.age) {
return -1;
} else{
return 0;
}
}
}
}
import java.util.*;
public class WorkerTest extends Worker{
public WorkerTest(String name, int age, float salary) {
super(name, age, salary);
}
public static void main(String[] args) {
List<Worker> list =new ArrayList();
list.add(new Worker("张三",30,9000));
list.add(new Worker("李四",31,12000));
list.add(new Worker("王五",28,9000));
list.add(new Worker("王三",23,9000));
list.add(new Worker("王二",26,12000));
list.add(new Worker("王六",30,12000));
list.add(new Worker("李美丽",48,12000));
list.add(1,new Worker("赵六",26,3300));
for(int i=0;i<list.size();i++){
if (list.get(i).getName().equals("王五")){
list.remove(i);
}
}
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
// //迭代器
// Iterator<Worker> it=list.iterator();
// while(it.hasNext()){
// Worker s=it.next();
// System.out.println(s);
// }
Collections.sort(list); //ComparableTo
//用sort方法排序,排序的条件是写在ComparaTo中的条件
System.out.println("排序后");
Iterator<Worker> it1=list.iterator();
while(it1.hasNext()){
Worker s=it1.next();
System.out.println(s);
}
}
}
执行结果:
Worker{name='张三', age=30, salary=9000.0}
Worker{name='赵六', age=26, salary=3300.0}
Worker{name='李四', age=31, salary=12000.0}
Worker{name='王三', age=23, salary=9000.0}
Worker{name='王二', age=26, salary=12000.0}
Worker{name='王六', age=30, salary=12000.0}
Worker{name='李美丽', age=48, salary=12000.0}
排序后
Worker{name='王二', age=26, salary=12000.0}
Worker{name='王六', age=30, salary=12000.0}
Worker{name='李四', age=31, salary=12000.0}
Worker{name='李美丽', age=48, salary=12000.0}
Worker{name='王三', age=23, salary=9000.0}
Worker{name='张三', age=30, salary=9000.0}
Worker{name='赵六', age=26, salary=3300.0}
Comparator(比较器)接口
主要实现语句:
类+implements Comparator<>{
…
public int compare(Worker o1,Worker o2){
return 0;
}
}
比较方法:
通过if(){}else{}语句进行判断返回值是-1,1,0中的哪一个,使用时通过返回的是-1,1,0来对比较者进行顺序的排列。
Comparator接口实现注意:接口的实现位置要不在类所在的位置,比如此类是Worker类那么Comparable接口不能在Worker类中实现。
Comparator接口的设计符合OCP原则。
例如:
public class Worker {
private String name;
private int age;
private float salary;
public Worker(String name, int age, float salary) {
this.name = name;
this.age = age;
this.salary = salary;
}
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 float getSalary() {
return salary;
}
public void setSalary(float salary) {
this.salary = salary;
}
@Override
public String toString() {
return "Worker{" +
"name='" + name + '\'' +
", age=" + age +
", salary=" + salary +
'}';
}
}
import java.util.Comparator;
public class WorkerComparator implements Comparator<Worker> {
@Override
public int compare(Worker o1, Worker o2) {
if (o1.getSalary() < o2.getSalary()) {
return 1;
} else if (o1.getSalary() > o2.getSalary()) {
return -1;
} else {
if (o1.getAge() > o2.getAge()) {
return 1;
} else if (o1.getAge() < o2.getAge()) {
return -1;
} else {
return 0;
}
}
}
}
Comparator接口实例
public class Worker {
private String name;
private int age;
private float salary;
public Worker(String name, int age, float salary) {
this.name = name;
this.age = age;
this.salary = salary;
}
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 float getSalary() {
return salary;
}
public void setSalary(float salary) {
this.salary = salary;
}
@Override
public String toString() {
return "Worker{" +
"name='" + name + '\'' +
", age=" + age +
", salary=" + salary +
'}';
}
}
import java.util.Comparator;
public class WorkerComparator implements Comparator<Worker> {
@Override
public int compare(Worker o1, Worker o2) {
if (o1.getSalary() < o2.getSalary()) {
return 1;
} else if (o1.getSalary() > o2.getSalary()) {
return -1;
} else {
if (o1.getAge() > o2.getAge()) {
return 1;
} else if (o1.getAge() < o2.getAge()) {
return -1;
} else {
return 0;
}
}
}
}
import java.util.*;
public class WorkerTest extends Worker{
public WorkerTest(String name, int age, float salary) {
super(name, age, salary);
}
public static void main(String[] args) {
List<Worker> list =new ArrayList();
list.add(new Worker("张三",30,9000));
list.add(new Worker("李四",31,12000));
list.add(new Worker("王五",28,9000));
list.add(new Worker("王三",23,9000));
list.add(new Worker("王二",26,12000));
list.add(new Worker("王六",30,12000));
list.add(new Worker("李美丽",48,12000));
list.add(1,new Worker("赵六",26,3300));
for(int i=0;i<list.size();i++){
if (list.get(i).getName().equals("王五")){
list.remove(i);
}
}
list.sort(new WorkerComparator());//Comparator
System.out.println("排序后");
Iterator<Worker> it1=list.iterator();
while(it1.hasNext()){
Worker s=it1.next();
System.out.println(s);
}
}
}
执行结果:
Worker{name='张三', age=30, salary=9000.0}
Worker{name='赵六', age=26, salary=3300.0}
Worker{name='李四', age=31, salary=12000.0}
Worker{name='王三', age=23, salary=9000.0}
Worker{name='王二', age=26, salary=12000.0}
Worker{name='王六', age=30, salary=12000.0}
Worker{name='李美丽', age=48, salary=12000.0}
排序后
Worker{name='王二', age=26, salary=12000.0}
Worker{name='王六', age=30, salary=12000.0}
Worker{name='李四', age=31, salary=12000.0}
Worker{name='李美丽', age=48, salary=12000.0}
Worker{name='王三', age=23, salary=9000.0}
Worker{name='张三', age=30, salary=9000.0}
Worker{name='赵六', age=26, salary=3300.0}
也可以使用匿名内部类对Comparator和Comparable接口进行简化
TreeSet<Users> U=new TreeSet(new Comparator<Users>(){
@Override
public int compare(Users o1, Users o2) {
return o1.getName()-o2.getName();
}
});
使用lambda表达式再简化
TreeSet<Users> U=new TreeSet<Users>((o1,o2)->{
return o1.getName()-o2.getName();
} );
Comparator和Comparable如何选择?
当比较规则不会发生改变的时候,或者说当比较规则只有1个的时候,建议实现Comparable接口;当比较规则有多个,并且需要多个比较规则之间平凡切换,建议使用Comparator接口。
边栏推荐
- MLX90640 红外热成像仪测温传感器模块开发笔记(六)
- js,e.pageX、pageY模态框拖动
- Self encapsulated database dbutils universal template
- 记给esp8266烧录刷固件
- 结构体操作报错:Segmentation fault (core dumped)
- 数据库的复习--3.SQL语言
- Using native JS to realize custom scroll bar (click to reach, drag to reach)
- 原生JS-获取transform值 x y z及rotate旋转角度
- Redis realizes distributed lock and gets a watchdog
- 函数模板参数(函数参数在哪)
猜你喜欢
随机推荐
About the declaration and definition of template functions [easy to understand]
Our Web3 entrepreneurship project is yellow
mysql 进不去了怎么办
Okaleido ecological core equity Oka, all in fusion mining mode
链式方法调用的事务问题剖析
Comparison of packet capturing tools fiddler and Wireshark
Agenda express | list of sub forum agenda on July 27
[Halcon vision] affine transformation
干货likeshop外卖点餐系统开源啦100%开源无加密
Tradingview 使用教程
Some cutting-edge research work sharing of SAP ABAP NetWeaver containerization
数据分析入门 | kaggle泰坦尼克任务(一)—>数据加载和初步观察
我们的Web3创业项目,黄了
String null to empty string (what does empty string mean)
[Qualcomm][Network] qti服务分析
【socket】三次握手是在listen中完成,accept只从完成连接的队列中拿出一个连接
详细解析js中的混合方式构造对象(构造加属性,原型加方法)
面试第一家公司的面试题及答案(一)
利用原生js实现自定义滚动条(可点击到达,拖动到达)
Controller返回JSON数据