当前位置:网站首页>比较器(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接口。
边栏推荐
- Listening freely, the next stop of online text traffic competition?
- Controller返回JSON数据
- 数据库的复习--3.SQL语言
- Use spiel expressions in custom annotations to dynamically obtain method parameters or execute methods
- [Qualcomm][Network] qti服务分析
- What will the new Fuzhou Xiamen railway bring to Fujian coastal areas?
- [Halcon vision] array
- 【Halcon视觉】图像滤波
- Introduction to data analysis | kaggle Titanic mission (I) - > data loading and preliminary observation
- [socket] the three handshakes are completed in listen, and accept only takes out one connection from the queue that completes the connection
猜你喜欢

码云,正式支持 Pages 功能,可以部署静态页面

数据分析入门 | kaggle泰坦尼克任务(一)—>数据加载和初步观察

Learning about tensorflow (II)

Dynamically determine file types through links

Introduction to data analysis | kaggle Titanic mission (I) - > data loading and preliminary observation

链式方法调用的事务问题剖析

Introduction to data analysis | kaggle Titanic mission

【Halcon视觉】形态学腐蚀
![[Halcon vision] affine transformation](/img/f1/32284c71e78e6eea390fdb6058ba0f.png)
[Halcon vision] affine transformation
![[Halcon vision] array](/img/29/905d93795a24538fded18d2d377e52.png)
[Halcon vision] array
随机推荐
MLX90640 红外热成像仪测温传感器模块开发笔记(六)
Agenda express | list of sub forum agenda on July 27
INSTALL_FAILED_SHARED_USER_INCOMPATIBLE错误解决方式
微信公众号发布提醒(微信公众号模板消息接口)
【Halcon视觉】仿射变换
Modelsim installation tutorial (application not installed)
Learning about opencv (4)
algorithm
2022/07/25 ------ arrangement of strings
[Qualcomm][Network] qti服务分析
MLX90640 红外热成像仪测温传感器模块开发笔记(六)红外图像伪彩色编码
面试第一家公司的面试题及答案(一)
Cause: couldn‘t make a guess for 解决方法
.NET操作Redis String字符串
.NET操作Redis List列表
What will the new Fuzhou Xiamen railway bring to Fujian coastal areas?
分布式锁解决方案之Redis实现
Our Web3 entrepreneurship project is yellow
[Halcon vision] polar coordinate transformation
PLC overview