当前位置:网站首页>比较器(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接口。
边栏推荐
- [C language] LINQ overview
- 函数模板参数(函数参数在哪)
- L2-005 set similarity (intersection of vector and set)
- 【Halcon视觉】仿射变换
- Learning about opencv (4)
- [Halcon vision] polar coordinate transformation
- [Halcon vision] Fourier transform of image
- 【Halcon视觉】形态学膨胀
- js下载文件,FileSaver.js导出txt、excel文件
- [Halcon vision] image filtering
猜你喜欢
随机推荐
【Halcon视觉】编程逻辑
单元测试,到底什么是单元测试,为什么单测这么难写
Draco developed by Google and Pixar supports USD format to accelerate 3D object transmission & lt; Forward & gt;
MD5加密
我们的Web3创业项目,黄了
【Halcon视觉】仿射变换
The CLOB field cannot be converted when querying Damon database
Employee information management system based on Web
Learning about tensorflow (I)
.NET操作Redis String字符串
[Halcon vision] programming logic
议程速递 | 7月27日分论坛议程一览
INSTALL_FAILED_SHARED_USER_INCOMPATIBLE错误解决方式
卸载魅族应用商店
Android greendao数据库的使用
Use of Android grendao database
.NET操作Redis Set无序集合
[C language] LINQ overview
少了个分号
Li Kou daily question 917


![[Halcon vision] morphological expansion](/img/ce/abaca036fce5b67dfe6ac361aecfea.png)

![[Halcon vision] threshold segmentation](/img/1c/e2463a796f99804a55680b69e714a6.png)




