Java之Comparator使用举例

简介

Comparator是一个比较器接口,位于java.util包下,用于排序和比较。

代码举例

import java.util.*;

/**
 * @author :gongxr
 * @description:Comparator比较器
 */
@Slf4j
public class ComparatorDemo {
    public List getList() {
        List users = new ArrayList<>();
        User user = new User("Tom", 22, "Street #1");
        users.add(user);
        users.add(new User("Michael", 33, "Street #2"));
        users.add(new User("Lily", 25, "Street #3"));
        return users;
    }

    @Test
    public void testComparator() {
        List users = getList();

        /*查询年龄最大的人*/
        Optional max = users.stream().max(Comparator.comparing(User::getAge));
        log.info("maxAge: " + max.get().toString());

        /*名字最长的人*/
        Optional max2 = users.stream().map(u -> u.getName()).max(Comparator.comparing(String::length));
        log.info("maxStringLength: " + max2.get());
    }

    /**
     * 排序
     * 在List或数组中的对象如果没有实现Comparable接口时,那么就需要调用者为需要排序的数组或List设置一个Compartor,
     * Compartor的compare方法用来告诉代码应该怎么去比较两个实例,然后根据比较结果进行排序
     */
    class Dog {
        public int age;
        public String name;

        public Dog(int age, String name) {
            super();
            this.age = age;
            this.name = name;
        }

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

    @Test
    public void test1() {
        List list = new ArrayList<>();
        list.add(new Dog(5, "DogA"));
        list.add(new Dog(6, "DogB"));
        list.add(new Dog(7, "DogC"));
        Collections.sort(list, new Comparator() {
            @Override
            public int compare(Dog o1, Dog o2) {
                return o2.age - o1.age;
            }
        });
        System.out.println("给狗狗按照年龄倒序:" + list);

        Collections.sort(list, new Comparator() {
            @Override
            public int compare(Dog o1, Dog o2) {
                return o1.name.compareTo(o2.name);
            }
        });
        System.out.println("给狗狗按名字字母顺序排序:" + list);
    }

    /**
     * 分组
     * 使用Comparator和for循环处理列表,来进行分类;通过调用者实现Comparator接口的比较逻辑,来告诉程序应该怎么比较,通过比较之后得结果来进行分组。
     * 下面例子中分别按照狗狗的颜色和体重级别两个维度来进行分组,因此分组的核心逻辑其实就是比较逻辑。
     * 下面抽了一个工具方法:dividerList,第一个参数为需要处理的数据源,第二参数是分组时的比较逻辑。
     */
    class Apple {
        public String color;
        public int weight;

        public Apple(String color, int weight) {
            super();
            this.color = color;
            this.weight = weight;
        }

        @Override
        public String toString() {
            return "Apple [color=" + color + ", weight=" + weight + "]";
        }
    }

    /*按条件分组*/
    public static  List> divider(Collection datas, Comparator super T> c) {
        List> result = new ArrayList>();
        for (T t : datas) {
            boolean isSameGroup = false;
            for (int j = 0; j < result.size(); j++) {
                if (c.compare(t, result.get(j).get(0)) == 0) {
                    isSameGroup = true;
                    result.get(j).add(t);
                    break;
                }
            }
            if (!isSameGroup) {
                // 创建
                List innerList = new ArrayList();
                result.add(innerList);
                innerList.add(t);
            }
        }
        return result;
    }

    @Test
    public void test2() {
        List list = new ArrayList<>();
        list.add(new Apple("红", 205));
        list.add(new Apple("红", 131));
        list.add(new Apple("绿", 248));
        list.add(new Apple("绿", 153));
        list.add(new Apple("红", 332));
        list.add(new Apple("黄", 119));
        list.add(new Apple("黄", 224));
        List> byColors = divider(list, new Comparator() {
            @Override
            public int compare(Apple o1, Apple o2) {
                // 按颜色分组
                return o1.color.compareTo(o2.color);
            }
        });
        System.out.println("按颜色分组" + byColors);

        List> byWeight = divider(list, new Comparator() {
            @Override
            public int compare(Apple o1, Apple o2) {
                // 按重量级

                return (o1.weight / 100 == o2.weight / 100) ? 0 : 1;
            }
        });
        System.out.println("按重量级分组" + byWeight);
    }

}

Original: https://www.cnblogs.com/gongxr/p/14512100.html
Author: 星瑞
Title: Java之Comparator使用举例

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/538649/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 设计模式之行为型模式–责任链模式、解释器模式

    一、责任链模式(职责链模式) 模式的定义与特点 责任链(Chain of Responsibility)模式的定义:为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处…

    Java 2023年6月7日
    070
  • SharePoint 2010 配置基于MemberShip的身份验证

    场景:通常需要为sharepoint打通其他的系统整合到sharepoint认证,ad通常是为内部域用户,外网访问的可以使用membership来登录,那么这个既可以内部用户访问,…

    Java 2023年6月7日
    088
  • 【Java】在IDEA中将Javafx项目打包成为可运行的.jar文件

    在IDEA中将Javafx项目打包成为可运行的.jar文件。 使用JDK17.0.2。 在使用Javafx制作一个图形化界面程序的时候,我遇到了打包文件的难题。按照网上给出的解决方…

    Java 2023年6月8日
    055
  • JavaFx制作简易的mp4播放器

    在制作视频播放器时,用JAVA语言编写是个很方便的选择。虽然JavaFX从JDK11开始就分离,但是在网上稍微搜索下就可以找到解决方法(在命令行下运行的命令是最清楚的)。原谅我不太…

    Java 2023年6月9日
    086
  • 从芒果分装角度—看MapReduce流程

    有一芒果产销基地,园区内有芒果种植园(产), 芒果分装库(装),芒果销路(销)。芒果种植园即HDFS中的文件,这个种植园规模很大,有不同的山头,假设一个山头一个分区。芒果的品质不同…

    Java 2023年6月8日
    0115
  • Java对接拼多多开放平台API(加密上云等全流程)

    前言 本文为【小小赫下士 blog】原创,搬运请保留本段,或请在醒目位置设置原文地址和原作者。 作者:小小赫下士 原文地址:Java对接拼多多开放平台API(加密上云等全流程) 本…

    Java 2023年6月8日
    070
  • java基础—java变量类型

    java变量类型 1、局部变量 概念:类的方法中的变量 2、实例变量 概念:定义在类里面,方法体、构造方法和语句块外,且不被static 修饰的变量,用于描述一个类中包含哪些数据 …

    Java 2023年6月8日
    083
  • JAVA UUID 生成

    在Java中生成UUID主要有以下几种方式: JDK1.5如果使用的JDK1.5的话,那么生成UUID变成了一件简单的事,以为JDK实现了UUID:java.util.UUID,直…

    Java 2023年5月29日
    052
  • Spring Security实现统一登录与权限控制

    1 项目介绍 最开始是一个单体应用,所有功能模块都写在一个项目里,后来觉得项目越来越大,于是决定把一些功能拆分出去,形成一个一个独立的微服务,于是就有个问题了,登录、退出、权限控制…

    Java 2023年6月7日
    073
  • 生产者、消费者模型—Queue类

    Queue队列在几乎每种编程语言都会有,python的列表隐藏的一个特点就是一个后进先出(LIFO)队列。而本文所讨论的Queue是python标准库queue中的一个类。它的原理…

    Java 2023年6月14日
    079
  • Java SE 多态

    多态数组:数组的定义类型为父类类型,里面保存的实际元素类型为子类类型 public class PloyArray { public static void main(String…

    Java 2023年6月7日
    0180
  • JVM内存结构

    JVM内存结构 1、java源码编译成java字节码 2、整体内存结构堆:https://blog.csdn.net/weixin_43304253/article/details…

    Java 2023年6月13日
    073
  • SpringBoot 2.0整合阿里云OSS,实现动静分离架构

    前言 相信大部分开发者对下面这张架构图并不陌生吧,现在很多网站/应用都采用了动静分离的架构进行部署。博主的博客也不例外,主机采用的是阿里云的 ECS,使用 CDN 做静态内容分发,…

    Java 2023年5月30日
    054
  • 基于Javaweb,Mysql图书管理系统

    一、项目简介 人工管理图书的手续繁索、效率低下给具有强烈时间观念的管理人员带来了诸多不便,学校图书馆缺少一套完善的图书管理软件,为了对图书的管理方便,因此必须开发图书管理系统。 二…

    Java 2023年6月8日
    079
  • spring中容器和对象的创建流程

    容器和对象的创建流程 1.先创建容器 2.加载配置文件,封装成BeanDefinition 3.调用执行BeanFactoryPostProcessor 准备工作: 准备BeanP…

    Java 2023年6月8日
    079
  • 2.Add Two Numbers——LeetCode

    You are given two non-empty linked lists representing two non-negative integers. The digit…

    Java 2023年6月15日
    088
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球