当前位置:网站首页>比较器(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接口。
边栏推荐
- Draco developed by Google and Pixar supports USD format to accelerate 3D object transmission & lt; Forward & gt;
- PTA class a 1002
- QRcode二维码(C语言)遇到的问题
- MD5加密
- MLX90640 红外热成像仪测温传感器模块开发笔记(六)
- 单元测试,到底什么是单元测试,为什么单测这么难写
- String null to empty string (what does empty string mean)
- The CLOB field cannot be converted when querying Damon database
- 详细解析js中的混合方式构造对象(构造加属性,原型加方法)
- 将json文件中数组转换为struct
猜你喜欢
随机推荐
STM32 阿里云MQTT esp8266 AT命令
Interview questions and answers for the second company (2)
简单化构造函数的继承方法(二)- ES6中的class继承
C语言计算日期间隔天数
抓包工具fiddler和wireshark对比
What is wrong about the description of function templates (how to solve link format errors)
3.1 leetcode daily question 6
Li Kou daily question 917
【C#语言】具名类型和匿名类型
Analyze the hybrid construction objects in JS in detail (construction plus attributes, prototype plus methods)
SAP ABAP Netweaver 容器化的一些前沿性研究工作分享
Using native JS to realize custom scroll bar (click to reach, drag to reach)
[Halcon vision] programming logic
Inheritance method of simplified constructor (I) - combined inheritance
Redis Docker实例与数据结构
js翻页、kkpager.js翻页
2022/07/25 ------ arrangement of strings
Comparison of packet capturing tools fiddler and Wireshark
404页面和路由钩子
分布式锁解决方案之Redis实现









