comparable和comparator的区别(代码实现比较两个person)

2024-06-19 02:32

本文主要是介绍comparable和comparator的区别(代码实现比较两个person),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  两者都是java的比较器。不过 comparable,需要被比较的类自己去实现排序逻辑;comparator不需要

Comparator和Comparable的区别

参数ComparableComparator
排序逻辑排序逻辑必须在待排序对象的类中,故称之为自然排序排序逻辑在另一个实现
实现实现Comparable接口实现Comparator接口
排序方法int compareTo(Object o1)int compare(Object o1,Object o2)
触发排序Collections.sort(List)Collections.sort(List, Comparator)
接口所在包java.lang.Comparablejava.util.Comparator

----------

实现比较person,先按年龄排,年龄相同的按工资排。

------

1.comparable 实现。(person类实现Comparable接口,实现比较方法compareTo,比较时使用Conllections.sort(list)即可 

package com.fjf.test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
 * 
 * 2018年7月14日 23:22:21
 * @author FJf
 * 
 * 比较大小 ,按年龄从小到大,年龄相同的;按工资多少排
 * Comparable 需要  被比较的对象 自己实现比较的方法
 */
public class TestComparable {

    public static void main(String[] args) {
         List<Person> list = new ArrayList<Person>();
         list.add(new Person("张三", 50,"男",500.00));
         list.add(new Person("李四", 27,"女",800.00));
         list.add(new Person("王五", 33,"男",500.00));
         list.add(new Person("赵六", 33,"男",1000.00));
         list.add(new Person("付8", 33,"男",500.00));
        
         for (Person p : list) {
                System.out.println(p);
            }
         
         System.out.println("--------Comparable比较----------");
         
        Collections.sort(list);
    
        for (Person p : list) {
            System.out.println(p);
        }
         
         
    }
}

class Person implements Comparable<Person>{
    private String name;
       
    private int age;
    
    private String sex;
    
    private double 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 String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    
    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    public Person(String name, int age, String sex,double salary) {
        super();
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.salary = salary;
    }

    public Person() {
        super();
    }

    @Override
    public int compareTo(Person o) {
        
        int ageCompare = this.age - o.age;
        
        if(ageCompare==0){ //年龄相同 用工资排
            int salaryCompare = (this.salary - o.salary)>0.00?-1:1; //工资如果再相同就不管了
            System.out.println(salaryCompare);
            return salaryCompare;
        }
        return ageCompare;
        
        //return o.age -this.age;
        //this.compareTo(o.age);
        //this.getAge().compareTo(o.getAge());
        //this.name.compareTo(anotherString)
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + ", sex=" + sex
                + ", salary=" + salary + "]";
    }

}

--------------------------------

2.comparator实现。(pesron类自己无需实现任何比较逻辑。在真正比较时,Conllections.sort(list,Comparator)在传入一个comparator比较器实现比较逻辑)

package com.fjf.test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;


/**
 * 
 * 2018年7月14日 23:42:30
 * @author fjf
 *  
 *  使用comparator比较
 */
public class TestComparator {
  
    
    public static void main(String[] args) {
        List<Person2> list = new ArrayList<Person2>();
         list.add(new Person2("张三", 50,"男",500.00));
         list.add(new Person2("李四", 27,"女",800.00));
         list.add(new Person2("王五", 33,"男",500.00));
         list.add(new Person2("赵六", 33,"男",1000.00));
         list.add(new Person2("付8", 33,"男",500.00));
         

         for (Person2 p : list) {
                System.out.println(p);
            }
         
         System.out.println("---------Comparator比较----------");
         
         Collections.sort(list, new Comparator<Person2>() {

            @Override
            public int compare(Person2 o1, Person2 o2) {
                int ageCompare = o1.getAge()-o2.getAge();
                if(ageCompare == 0){
                    int salaryCompare = (o1.getSalary()-o2.getSalary()>0.00?1:-1);
                    return salaryCompare;
                }
                return ageCompare;
            }
        });
         
         for (Person2 p : list) {
                System.out.println(p);
            } 
         
         
    }
    
    
}
     class Person2 {
        private String name;
           
        private int age;
        
        private String sex;
        
        private double 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 String getSex() {
            return sex;
        }

        public void setSex(String sex) {
            this.sex = sex;
        }

        public double getSalary() {
            return salary;
        }

        public void setSalary(double salary) {
            this.salary = salary;
        }

        public Person2(String name, int age, String sex, double salary) {
            super();
            this.name = name;
            this.age = age;
            this.sex = sex;
            this.salary = salary;
        }

        public Person2() {
            super();
        }

        @Override
        public String toString() {
            return "Person [name=" + name + ", age=" + age + ", sex=" + sex
                    + ", salary=" + salary + "]";
        }
        
    }

---

附:网友的一些介绍。

https://blog.csdn.net/u013256816/article/details/50899416/

https://blog.csdn.net/u014133299/article/details/78608454

 

这篇关于comparable和comparator的区别(代码实现比较两个person)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1073762

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形