首页 > 编程语言 >Java 中的比较器

Java 中的比较器

时间:2024-02-06 15:45:03浏览次数:59  
标签:Java age public new WuGui 比较 wuGuis TreeSet

比较器

TreeSet集合中元素可排序的方式:使用比较器的方式

结论:放到TreeSet或者TreeMap集合中的key部分的元素要想做到排序,有两种方法:

第一种:放到集合中的元素实现java.lang.Comparable接口

import java.util.Comparator;
import java.util.TreeSet;

public class TreeSetTest02 {
    public static void main(String[] args) {
        TreeSet<WuGui> wuGuis = new TreeSet<>();

        wuGuis.add(new WuGui(100));
        wuGuis.add(new WuGui(1000));
        wuGuis.add(new WuGui(60));
        for(WuGui a : wuGuis){
            System.out.println(a);
        }

    }
}


class WuGui implements Comparable<WuGui>{
    int age;
    public WuGui(int age ){
        this.age = age;
    }

    @Override
    public String toString() {
        return "WuGui{" +
                "age=" + age +
                '}';
    }

    @Override
    public int compareTo(WuGui o) {
        return this.age - o.age;
    }
}

第二种:在构造TreeSet或者TreeMap集合中传递一个比较器Comparator

import java.util.Comparator;
import java.util.TreeSet;

public class TreeSetTest02 {
    public static void main(String[] args) {
        //创建TreeSet集合的时候,需要使用比较器
        // TreeSet<WuGui> wuGuis = new TreeSet<>();//这样不行,没有通过构造方法传递一个比较器
        // 通过构造方法传递一个比较器
//        TreeSet<WuGui> wuGuis = new TreeSet<>(new WuGuiCompparator());

        // 还可以使用匿名内部类的方式
        TreeSet<WuGui> wuGuis = new TreeSet<>(new Comparator<WuGui>() {
            @Override
            public int compare(WuGui o1, WuGui o2) {
                return -o1.age + o2.age;
            }
        });

        wuGuis.add(new WuGui(100));
        wuGuis.add(new WuGui(1000));
        wuGuis.add(new WuGui(60));
        for(WuGui a : wuGuis){
            System.out.println(a);
        }

    }
}


class WuGui{
    int age;
    public WuGui(int age ){
        this.age = age;
    }

    @Override
    public String toString() {
        return "WuGui{" +
                "age=" + age +
                '}';
    }
}
// 单独编写一个比较器
// 比较器实现是java.util.Comparator下的 (Comparable 是java.lang包下的)
class WuGuiCompparator implements Comparator<WuGui>{
    //指定规则
    //按照年龄排序
    @Override
    public int compare(WuGui o1, WuGui o2) {
        return -o1.age + o2.age;
    }
}
  • 对于Comparable 和 Comparator怎么选择?

当比较器规则不会发生改变的时候,或者说比较器规则单一,建议实现Comparable接口

如果比较器规则多个,并且需要多个比较器之间频繁切换,建议使用Comparator接口

Comparator接口符合OCP原则

标签:Java,age,public,new,WuGui,比较,wuGuis,TreeSet
From: https://www.cnblogs.com/shijili/p/18009831

相关文章

  • java 关于有序获取多线程的返回结果问题,按提交任务的顺序,收集执行结果
    问题:以前做的多线程,执行的返回结果都是无序的,所以每次执行完毕后还要对结果集重新进行排序,增加了耗时; 今天突然想到一个思路,在给线程池提交任务的时候,可以提前获取任务总数,创建一个用于接收结果集的固定大小list2,然后子线程执行的时候把当前任务序号传进去,处理好数据后根据序号......
  • 了解Java
    Java版本发展路线从Java5开始,舍弃小版本命名,使用大版本号的方式命名。Java平台分为JaveSE、JaveEE、JaveME三类JaveSE、JaveEE、JaveMEJaveSE:(JavaPlatform,StandardEdition,又称J2SE),可以理解为Java标准版本包含了Java日常开发使用的基本类,允许开发和部署在桌面、服务器、嵌......
  • JAVA之异常处理
    一、异常的体系结构Throwable:是java中所有异常和错误的父类,其包括两个子类Error(错误)和Exception(异常)。Error:是程序中无法处理的错误,一般是指与虚拟机相关的问题,如系统崩溃、虚拟机错误、动态链接失败等。这类错误无法恢复或捕获,将会导致应用程秀中断。此类异常发生时,必须手......
  • JavaScript的正则表达式
    目录一、概念二、修饰符1.g(global,全局)2.i(ignorecase,不区分大小写)3.m(multi-line,多行)4.s(single-line,单行)5.u(Unicode,Unicode字符)6.y(sticky,粘性)三、元字符1..(匹配非换行符\n的任意一个字符)2.\d(匹配数字)3.\D(匹配除数字以外的所有字符)......
  • Java学习初体验
    1.安装JDK进入官网:https://oracle.com->Products->Java->DownloadJava选择JDK版本,再选择相应操作系统,注意CPU架构为X86还是ARM,安装即可。ps:下载JDK版本要下载TLS版本,LTS(Long-TermSupport,长期支持)是指针对软件的某一版本,提供长时间的技术支持、安全更新和错误......
  • JavaScript移动端的手指触摸touch事件
    目录概念touchstart触摸发生事件touchend触摸结束事件touchmove触摸移动事件touchcancel触摸取消事件自定义事件自定义轻触事件方法touchtap自定义左右划动事件方法touchswiper概念在JavaScript中,移动端基本的手指触摸touch事件有四种,分别为:touchstart:手指触摸屏幕时......
  • JavaScript函数柯里化
    目录概念函数柯里化的实现函数柯里化简写函数柯里化使用案例函数柯里化工厂函数概念函数柯里化就是给一个函数传入一部分参数,此时就会返回一个函数来接收剩余的参数。使用场景:递归使用和处理函数,函数功能尽可能单一。函数柯里化的实现//没有柯里化的实现function......
  • java实现导出mysql数据库表信息
    java实现导出mysql数据库表信息,导出信息包含:数据库用户名,表英文名,表中文名,表业务描述,字段数量等等packagesrc.main.biz.ucenter.utils;importorg.apache.poi.ss.usermodel.Row;importorg.apache.poi.ss.usermodel.Sheet;importorg.apache.poi.ss.usermodel.Workbook;impor......
  • 解密JavaChassis3:易扩展的多种注册中心支持
    本文分享自华为云社区《JavaChassis3技术解密:易扩展的多种注册中心支持》,作者:liubao68。JavaChassis的早期版本依赖于ServiceCenter,提供了很多差异化的竞争力:接口级别转发。通过注册中心管理微服务的每个版本的元数据,特别是契约数据。结合契约数据,能够实现版本级别的路由......
  • 深入浅出Java多线程(九):synchronized与锁
    引言大家好,我是你们的老伙计秀才!今天带来的是[深入浅出Java多线程]系列的第九篇内容:synchronized与锁。大家觉得有用请点赞,喜欢请关注!秀才在此谢过大家了!!!在现代软件开发中,多线程技术是提升系统性能和并发能力的关键手段之一。Java作为主流的编程语言,其内置的多线程机制为开发者......