如何在Java中实现多条件排序

news2025/1/23 22:25:07

文章目录

  • 前言
  • 一、在Java中使用Comparator接口实现多条件排序
  • 二、视频讲解
  • 总结


前言

多条件排序是一个复杂而实用的技术问题,它涉及到算法、数据结构等多个领域。
在实际工作中,我们常常需要根据多个条件对数据进行排序,以达到最优化的效果。
以下文章将使用Comparator接口来实现在多个条件下的排序。


一、在Java中使用Comparator接口实现多条件排序

首先,我们有一个Statistics类,它有三个属性:a,b和c。

public class Statistics {
    private int a;
    private int b;
    private int c;

    public Statistics(int a, int b, int c) {
        this.a = a;
        this.b = b;
        this.c = c;
    }

    public int getA() {
        return a;
    }

    public void setA(int a) {
        this.a = a;
    }

    public int getB() {
        return b;
    }

    public void setB(int b) {
        this.b = b;
    }

    public int getC() {
        return c;
    }

    public void setC(int c) {
        this.c = c;
    }

    @Override
    public String toString() {
        return "Statistics{" +
                "a=" + a +
                ", b=" + b +
                ", c=" + c +
                '}';
    }
}

我们的目标是根据这三个属性对Statistics对象的列表进行排序。
他们的优先级是a>b>c.;先按a进行排序,如果a相等再按b排序,如果b相等再按c排序。

代码如下:
当a不等时,按照a进行排序:

import java.util.Arrays;
import java.util.List;

public class demo {
    public static void main(String[] args) {
        List<Statistics> list = Arrays.asList(
                new Statistics(1, 0, 0),
                new Statistics(2, 0, 0),
                new Statistics(3, 0, 0)
        );
        list.sort(((o1, o2) -> {
            if(o1.getA()!=o2.getA())
                return Integer.compare(o2.getA(),o1.getA());
            if(o1.getB()!=o2.getB())
                return Integer.compare(o2.getB(),o1.getB());
            return Integer.compare(o2.getC(),o1.getC());
        }));
        list.forEach(System.out::println);
    }
}

结果如下:

Statistics{a=3, b=0, c=0}
Statistics{a=2, b=0, c=0}
Statistics{a=1, b=0, c=0}

当a相等,对b进行比较:

import java.util.Arrays;
import java.util.List;

public class demo {
    public static void main(String[] args) {
        List<Statistics> list = Arrays.asList(
                new Statistics(1, 0, 0),
                new Statistics(2, 1, 0),
                new Statistics(2, 2, 0)
        );
        list.sort(((o1, o2) -> {
            if(o1.getA()!=o2.getA())
                return Integer.compare(o2.getA(),o1.getA());
            if(o1.getB()!=o2.getB())
                return Integer.compare(o2.getB(),o1.getB());
            return Integer.compare(o2.getC(),o1.getC());
        }));
        list.forEach(System.out::println);
    }
}

结果如下:

Statistics{a=2, b=2, c=0}
Statistics{a=2, b=1, c=0}
Statistics{a=1, b=0, c=0}

当a相等,b相等的情况下:

import java.util.Arrays;
import java.util.List;

public class demo {
    public static void main(String[] args) {
        List<Statistics> list = Arrays.asList(
                new Statistics(1, 0, 0),
                new Statistics(2, 1, -1),
                new Statistics(2, 1, 0)
        );
        list.sort(((o1, o2) -> {
            if(o1.getA()!=o2.getA())
                return Integer.compare(o2.getA(),o1.getA());
            if(o1.getB()!=o2.getB())
                return Integer.compare(o2.getB(),o1.getB());
            return Integer.compare(o2.getC(),o1.getC());
        }));
        list.forEach(System.out::println);
    }
}

结果如下:

Statistics{a=2, b=1, c=0}
Statistics{a=2, b=1, c=-1}
Statistics{a=1, b=0, c=0}

为了实现这个排序,我们使用list.sort方法,并传入一个比较器(Comparator)。
这个比较器接受两个参数,返回一个整数,该整数表示第一个参数与第二个参数的比较结果。
在比较器中,我们首先比较o1和o2的a属性。如果o1的a属性不等于o2的a属性,那么我们返回Integer.compare(o2.getA(), o1.getA())。
如果a属性的比较结果为0,那么我们继续比较b属性。同样地,如果b属性的比较结果为0,我们继续比较c属性。
最后,我们返回Integer.compare(o2.getC(), o1.getC()),这是根据c属性对o1和o2进行排序的最终比较结果。
完成这些步骤后,我们的列表就会根据a,b和c属性的顺序进行排序。最后,我们使用list.forEach方法来遍历排序后的列表,并打印每个对象的属性值。
这样,我们就实现了一个多条件排序的示例,希望能帮助你理解如何在Java中实现类似的功能。

二、视频讲解

B站视频链接

总结

总结起来,通过使用Comparator接口,我们可以灵活地定义排序规则,以满足不同的需求。在这个例子中,我们根据Statistics对象的a,b和c属性进行了排序,展示了如何在Java中实现多条件排序。

@作者:加辣椒了吗?
简介:憨批大学生一枚,喜欢在博客上记录自己的学习心得,也希望能够帮助到你们!
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1289780.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

桶排序去重

题目&#xff1a; #include<stdio.h> int main() { int a[1001], n, i, t; for (i 1;i < 1000;i) { a[i] 0;//初始化 } scanf("%d", &n);//读入n for (i 1;i < n;i)//循环读入n个图书的ISBN号 { scanf(&…

ABAP 字符串空白值保留长度或者用其他字符替代

保留空白值在字符串的长度。 DATA lv_char1 TYPE string VALUE Hello. DATA lv_char2 TYPE string VALUE World. DATA LV_CHAR3 TYPE C LENGTH 50.DATA(lv_string3) |{ lv_char1 } { lv_char2 }!|.WRITE: / lv_string3.DATA(lv_string2) lv_char1 && | { lv_char3 } …

分库分表详解

分库分表很常见&#xff0c;但这些问题90%的人都答不全 分库分表&#xff0c;是企业里面比较常见的针对高并发、数据量大的场景下的一种技术优化方案&#xff0c;也是一个非常高频的面试题。但是&#xff0c;因为很多人其实并没有非常丰富的分库分表的经验&#xff0c;所以能把…

虚拟线程原理及性能分析

一、背景 JDK21 在 9 月 19 号正式发布&#xff0c;带来了较多亮点&#xff0c;其中虚拟线程备受瞩目&#xff0c;毫不夸张的说&#xff0c;它改变了高吞吐代码的编写方式&#xff0c;只需要小小的变动就可以让目前的 IO 密集型程序的吞吐量得到提升&#xff0c;写出高吞吐量的…

甘草书店:#8 2023年11月22日 星期三「“说一套做一套”的甘草与麦田」

最近与甘草书店的投资方和意向投资方沟通&#xff0c;听取了来自不同领域不同人群的观点。他们讲的都有道理&#xff0c;但他们说的都不是甘草。就像“麦田”成立之前&#xff0c;世间没有“麦田”一样&#xff1b;“甘草”出现之前&#xff0c;世间没有也没有“甘草”。 故事…

UDP多人群聊

一&#xff0c;创建类 二&#xff0c;类 1&#xff0c;Liao类 import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.net.*; import java.io.IOException; import java.lang.String; public class Liao extends JFrame{ private static fi…

智慧景区(园区)数字孪生可视化GIS解决方案

随着技术的日新月异&#xff0c;景区日常管理及运营中使用到的智慧化工具越来越丰富&#xff0c;智慧化硬件设备也越来越多&#xff0c;而其中各个管理系统往往又是相互独立&#xff0c;形成一个个数据孤岛。智慧景区管理平台就是将各个孤岛中的数据及功能汇集起来&#xff0c;…

【数据结构】动态规划(Dynamic Programming)

一.动态规划&#xff08;DP&#xff09;的定义&#xff1a; 求解决策过程&#xff08;decision process&#xff09;最优化的数学方法。 将多阶段决策过程转化为一系列单阶段问题&#xff0c;利用各阶段之间的关系&#xff0c;逐个求解。 二.动态规划的基本思想&#xff1a; …

Kubernetes常用工作负载控制器

文章目录 一、常用负载控制器是什么二、Deployment控制器1.介绍2.使用流程3.应用部署4.应用升级5.滚动升级实现原理&#xff08;replicaset控制器&#xff09;6.滚动升级实现流程7.滚动升级策略8.应用实例扩容和缩容9.应用发布失败回滚10.应用下线 三、DaemonSet控制器四、Job控…

elk+kafka+filebeat

elk1 cd /opt 把filebeat投进去 tar -xf filebeat-6.7.2-linux-x86_64.tar.gz mv filebeat-6.7.2-linux-x86_64 filebeat cd filebeat/ yum -y install nginx systemctl restart nginx vim /usr/share/nginx/html/index.html this is nginx cp filebeat.yml filebeat.yml.…

在Vivado 仿真器中搭建UVM验证环境(不需要联合modelsim)

Vivado 集成设计环境支持将通用验证方法学 (UVM) 应用于 Vivado 仿真器。Vivado 提供了预编译的 UVM V1.2 库。 &#xff08;1&#xff09;在 Vivado 2019.2 中创建新 RTL 工程。 &#xff08;2&#xff09;单击“添加目录 (Add Directories)”以将“src”和“verif”目录添加…

LLM大语言模型(一):ChatGLM3-6B本地部署

目录 前言 本机环境 ChatGLM3代码库下载 模型文件下载 修改为从本地模型文件启动 启动模型网页版对话demo 超参数设置 GPU资源使用情况 &#xff08;网页对话非常流畅&#xff09; 前言 LLM大语言模型工程化&#xff0c;在本地搭建一套开源的LLM&#xff0c;方便后续的…

Python实现FA萤火虫优化算法优化LightGBM分类模型(LGBMClassifier算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 萤火虫算法&#xff08;Fire-fly algorithm&#xff0c;FA&#xff09;由剑桥大学Yang于2009年提出 , …

空间金字塔池化(SPP,Spatial Pyramid Pooling)系列

空间金字塔池化的作用是解决输入图片大小不一造成的缺陷&#xff0c;同时在目标识别中增加了精度。空间金字塔池化可以使得任意大小的特征图都能够转换成固定大小的特征向量&#xff0c;下面针对一些典型的空间金字塔进行盘点。 部分图片来自blog:空间金字塔池化改进 SPP / SP…

第二十一章总结

一、网络通信&#xff1a; 1.网络程序设计基础&#xff1a;网络程序设计编写的是与其他计算机进行通信的程序。 1.1局域网与互联网&#xff1a;为了实现两台计算机的通信&#xff0c;必须用一个网络线路连接两台计算机 2.网络协议&#xff1a;网络协议规定了计算机之间连接的…

【精选】WebLogic-CVE-2017-3506

下载地址&#xff1a; https://github.com/Al1ex/CVE-2017-3506https://github.com/Al1ex/CVE-2017-3506 1.weblogic wls-wsat组件远程命令执行&#xff08;CVE-2017-3506&#xff09; 复现&#xff1a; ┌──(root&#x1f480;kali)-[~/routing/红日2/CVE-2017-3506-mai…

C++利剑string类(详解)

前言&#xff1a;大家都知道在C语言里面的有 char 类型&#xff0c;我接下来要讲的 string 类功能是使用 char 类型写的类&#xff0c;当然这个是C官方写的&#xff0c;接下来我们将会学会使用它&#xff0c;我们会发现原来 char 这种类型是还能这么好用&#xff0c;授人以…

结构体精讲1

这一期我们讲一讲C语言中的自定义类型中的其中一种类型--->结构体 相信大家对于结构体都听了很久了吧&#xff0c;下面就由我来带领大家一起学习学习&#xff01; 结构体类型是一种自定义的数据类型&#xff0c;用来组织不同类型的数据成员。结构体可以包含多个不同类型的…

【Proteus】绘制简单的电路图

参考书籍&#xff1a;微机原理与接口技术——基于8086和Proteus仿真&#xff08;第3版&#xff09;&#xff08;作者&#xff1a;顾晖等&#xff09;&#xff0c;p111 1.放置元件 以8086为例&#xff1a; 确保处于元件模式&#xff0c;点击对应的按钮&#xff1a; 在元件库中…

【创意坊】技术征战:揭秘CSDN博客等级与原力等级的战略大计

目录 &#x1f4cb; 前言 1. 博客等级 1.1 博客积分规则 1.2 博客等级划分 1.3 博客等级权益 2. 原力等级 2.1 原力积分规则 2.2 原力等级划分 2.3 原力等级权益 3. 文章点赞评论规则 &#x1f4dd;总结 &#x1f4cb; 前言 &#x1f308;个人主页&#xff1a;Sarapi…