【第43天】sort 的复杂运用 | 对二维数组与结构体实现自定义排序

news2025/1/7 7:04:39
本文已收录于专栏
🌸《Java入门一百练》🌸

学习指引

  • 序、专栏前言
  • 一、二维排序
  • 二、【例题1】
    • 1、题目描述
    • 2、解题思路
    • 3、模板代码
    • 4、代码解析
  • 三、【例题2】
    • 1、题目描述
    • 2、解题思路
    • 3.模板代码
    • 4.代码解析
  • 四、推荐专栏
  • 五、课后习题

序、专栏前言

   本专栏开启,目的在于帮助大家更好的掌握学习Java,特别是一些Java学习者难以在网上找到系统地算法学习资料帮助自身入门算法,同时对于专栏内的内容有任何疑问都可在文章末尾添加我的微信给你进行一对一的讲解。
   但最最主要的还是需要独立思考,对于本专栏的所有内容,能够进行完全掌握,自己完完全全将代码写过一遍,对于算法入门肯定是没有问题的。
   算法的学习肯定不能缺少总结,这里我推荐大家可以到高校算法社区将学过的知识进行打卡,以此来进行巩固以及复习。
  学好算法的唯一途径那一定是题海战略,大量练习的堆积才能练就一身本领。专栏的任何题目我将会从【题目描述】【解题思路】【模板代码】【代码解析】等四板块进行讲解。

一、二维排序

  一维数组排序的需求很常见,我们上篇文章也已经详细讲解过。但其实二维排序问题,也是很常见的问题,特别是刷题时,很多算法都涉及到二维排序的问题,比如最小生成树的kruskal算法以及优化版最短路dijkstra,虽然dijkstra中使用的是优先队列,但本质还是一个排序比较的区别,我们需要去自定义排序。
  当然想实现自定义排序的做法有很多,下文给大家写的都是代码量最少,最好写的方法,当然也具有一定的局限性。

二、【例题1】

1、题目描述

请你将一些箱子装在 一辆卡车 上。给你一个二维数组 boxTypes ,其中 boxTypes[i] = [numberOfBoxesi, numberOfUnitsPerBoxi]

numberOfBoxesi 是类型 i 的箱子的数量。
numberOfUnitsPerBoxi 是类型 i 每个箱子可以装载的单元数量。
整数 truckSize 表示卡车上可以装载 箱子 的 最大数量 。只要箱子数量不超过 truckSize ,你就可以选择任意箱子装到卡车上。

返回卡车可以装载 单元 的 最大 总数。

2、解题思路

显然从贪心的角度来说,我们会选择装载单元数量更大的箱子,也就需要对numberOfUnitsPerBoxi这一个属性进行排序,然后进行选择。

3、模板代码

class Solution {
   public int maximumUnits(int[][] boxTypes, int truckSize) {
        //重写比较器,让能装单元数多的箱子排在前边
        Arrays.sort(boxTypes,(a,b)->b[1]-a[1]);
        //贪心,先让能装多的箱子上车
        int count = 0;
        for(int[] box : boxTypes){
            if(box[0] < truckSize){
        //0表示箱子数量,1表示箱子里装的单元数
                count += box[0] * box[1];
                truckSize -= box[0];
            }else{
                count += truckSize * box[1];
                return count;
            }
        }
        return count;
    }
}

4、代码解析

(a,b)->b[1]-a[1]这种写法,是Java中lambda表达式的写法,本质上我们这样写其实还是实现了一个函数,本质上是实现了一个比较器,ab只是一个参数名。也就是对于任意相邻的数组,让其下标为1来进行排序,这里我们实现的是一个降序排序,如果想实现升序可以写为a[1]-b[1]

三、【例题2】

1、题目描述

给你一个字符串数组 names ,和一个由 互不相同 的正整数组成的数组 heights 。两个数组的长度均为 n

对于每个下标inames[i]heights[i] 表示第 i 个人的名字和身高。

请按身高 降序 顺序返回对应的名字数组 names

2、解题思路

具有一个String类型和int类型的结构,我们只能使用结构体去进行存储排序

3.模板代码

 public String[] sortPeople(String[] names, int[] heights) {
        int n = names.length;
        Node[] node = new Node[n];
        for (int i = 0; i < n; i++) {
            node[i] = new Node(names[i], heights[i]);
        }
        Arrays.sort(node, Comparator.comparing(a -> a.d));
        int pre = n - 1;
        for (int i = 0; i < n; i++) {
            names[i] = node[pre--].s;
        }
        return names;
    }

     class Node {
        String s;
        int d;

        public Node(String s, int d) {
            this.s = s;
            this.d = d;
        }
    }

4.代码解析

Comparator.comparing(a -> a.d)这个参数,含义是直接指定该结构体以d进行排序,d就是我们结构体的身高属性。对于一个结构体或者二维数组,想指定某个属性进行排序,我们即可以使用这个函数指定。当然如果是想实现复杂的自定义排序时,我们还是选择实现Comparable这个接口,然后重写compareTo比较方法。

public String[] sortPeople(String[] names, int[] heights) {
        int n = names.length;
        Node[] node = new Node[n];
        for (int i = 0; i < n; i++) {
            node[i] = new Node(names[i], heights[i]);
        }
        Arrays.sort(node);
        int pre = n - 1;
        for (int i = 0; i < n; i++) {
            names[i] = node[pre--].s;
        }
        return names;
    }

     class Node implements Comparable<Node> {
        String s;
        int d;
        public Node(String s, int d) {
            this.s = s;
            this.d = d;
        }
         @Override
         public int compareTo(Node o) {
             return d-o.d;
         }
     }

在这里插入图片描述

四、推荐专栏

🌌《零基础学算法100天》🌌

五、课后习题

序号题目链接难度评级
1 卡车上的最大单元数1
1 按身高排序1
👇 学习有疑问?👇

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

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

相关文章

【ESP 保姆级教程】疯狂毕设篇 —— 案例:基于ESP8266和EMQX的教室灯光控制系统

忘记过去,超越自己 ❤️ 博客主页 单片机菜鸟哥,一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2023-02-26 ❤️❤️ 本篇更新记录 2022-02-26 ❤️🎉 欢迎关注 🔎点赞 👍收藏 ⭐️留言📝🙏 此博客均由博主单独编写,不存在任何商业团队运营,如发现错误,请…

二、mysql索引分析之二

二、mysql索引分析之一 二、mysql索引分析之二 二、mysql索引分析之二1 mysql的索引类型2 Explain执行计划2.1 执行计划之 id 属性2.1.1 id 的属性相同表示加载表的顺序是从上到下2.1.2 id 值越大&#xff0c;优先级越高2.1.3 id 有相同&#xff0c;也有不同&#xff0c;同时存…

【GO】k8s 管理系统项目22[前端部分–工作负载-Deployment]

k8s 管理系统项目[前端部分–工作负载-Deployment] 1. Deployment页面设计 src/layout/Layout.vue 功能 列表详情新增更新删除重启副本数 Main的布局 2. 连接配置 src/views/common/Config.js export default {//后端接口路径loginAuth: http://localhost:9091/api/login,…

RCEE: Event Extraction as Machine Reading Comprehension 论文解读

RCEE: Event Extraction as Machine Reading Comprehension 论文&#xff1a;Event Extraction as Machine Reading Comprehension (aclanthology.org) 代码&#xff1a;jianliu-ml/EEasMRC (github.com) 期刊/会议&#xff1a;EMNLP 2020 摘要 事件提取(Event extraction,…

Slurm集群调度策略详解(2)-回填调度

1. slurm集群调度系统简介 作业调度系统其实就是指按一定策略把并行程序的各子任务或者是面向多用户的一组作业按一定的选择策略使之与各计算节点的空闲资源相对应&#xff0c;让其在对应的资源上运行&#xff0c;所以作业调度系统是联系上层应用和下层资源的中枢。一个集群资…

纯x86汇编实现的多线程操作系统实践 - 第六章 AP1的用户进程

AP1用户进程的代码为task1.asm。该用户进程将调用0x80系统中断在界面上显示一张BMP格式的图片。用户进程还使用了彩色转灰色技术&#xff0c;轮流显示该图片的彩色和灰色图。代码解释如下&#xff1a;调用0x39号系统中断&#xff0c;从300号扇区获得一个扇区的数据&#xff08;…

【华为OD机试模拟题】用 C++ 实现 - 身高排序(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 去重求和(2023.Q1) 文章目录 最近更新的博客使用说明身高排序题目输入输出示例一输入输出Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:ht…

每日学术速递2.27

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CL 1.FiTs: Fine-grained Two-stage Training for Knowledge-aware Question Answering 标题&#xff1a;FiTs&#xff1a;用于知识感知问答的细粒度两阶段训练 作者&#xff1a;Qichen…

JavaWeb JavaBean,MVC三层架构

9、JavaBean 实体类 JavaBean有特定的写法&#xff1a; 必须要有一个无参构造属性必须私有化必须有对应的get/set方法&#xff1b; 一般用来和数据库的字段做映射 ORM&#xff1b; ORM &#xff1a;对象关系映射 表—>类字段–>属性行记录---->对象 people表 …

Qt 小项目 图片浏览系统

引言 本系统支持&#xff0c;自动播放&#xff0c;左右拖动切换&#xff0c;点击列表切换&#xff0c;点击按钮切换&#xff1b;是一个标准的图像浏览软件。 Windows 图片浏览器&#xff0c;可以查看当前文件夹下的图片&#xff0c;往上翻、往下翻并且自动播放&#xff1b; …

这只乌龟,当然离不开函数了!

什么是函数&#xff1f;函数就是执行特定任务和以完成特定功能的一段代码为什么需要函数&#xff1f;复用代码隐藏实现细节提高可维护性提高可读性便于调试函数的创建def 函数名 ([输入参数]) :函数体[return xxx]函数名需要遵循字母、数字、下划线# 这里的a&#xff0c;b是形式…

03 流程控制

3.1 条件判断3.2 循环控制3.3 中断循环 3.1 条件判断 if 条件判断 &#xff1a;单分支&#xff08;if&#xff09;、双分支&#xff08;if…else…&#xff09;、多分支&#xff08;if … else if … else&#xff09;Switch&#xff08;Scala并没有 switch&#xff0c;用的是…

2023年鞋服配饰行业如何玩转全域经营?

2023年&#xff0c;鞋服配饰行业私域已进入深水区&#xff0c;这就对私域运营提出了更高的挑战和目标&#xff0c;企业纷纷发力以私域为基石、以消费者为核心的全域经营。 不过&#xff0c;虽然鞋服配饰行业私域起步早&#xff0c;玩法多。但在迈向全域经营的过程中&#xff0…

全网详细介绍nginx的反向代理、正向代理配置,location的指令说明,反向代理的两个示例代码以及全局块,events块和http快的说明。

文章目录1. 文章引言2. 何谓反向代理3. 解析nginx的配置文件3.1 全局块(global block)3.2 events块(events block)3.3 http块(http block)4. 如何配置反向代理4.1 反向代理示例14.2 反向代理示例25. 补充说明5.1 location指令说明5.2 nginx完整配置文件1. 文章引言 如果你的服务…

聚合效度全流程

聚合效度分析流程如下&#xff1a; 一、聚合效度定义 聚合效度&#xff08;convergent validity&#xff09;&#xff0c;又称收敛效度&#xff0c;是指测量同一变量的测量项会落在同一因子上&#xff0c;强调本应该在同一因子下的测量项&#xff0c;确实在同一因子下。即一个…

基于nodejs+vue地方特色的风景文化宣传网站vscode

管理员可以根据系统给定的账号进行登录&#xff0c;登录后可以进入木里风景文化管理平台对木里风景文化所有模块进行管理。包括查看和修改自己的个人信息以及登录密码。 该系统为每一个用户都分配了一个用户账号&#xff0c;用户通过账号的登录可以在系统中查看木里风景文化信息…

怎么依靠网络赚钱,网上可以做什么副业

如今&#xff0c;网上赚钱已经成为许多人职业生涯的选择之一。网上有很多可靠的兼职&#xff0c;让你在家里轻松赚钱。今天给大家推荐五份可靠的网上兼职。一、怎样选择可靠的网络兼职可靠的网络兼职一般是指在家通过网络平台完成兼职任务&#xff0c;完成任务后即可获得报酬。…

JVM中TLAB(Thread Local Allocation Buffer)+逃逸分析

1、为什么有TLAB&#xff08;Thread Local Allocation Buffer&#xff09;堆区是线程共享区域&#xff0c;任何线程都可以访问到堆区中的共享数据 由于对象实例的创建在JVM中非常频繁&#xff0c;因此在并发环境下从堆区中划分内存空间是线程不安全的 为避免多个线程操作同一地…

java地图导出——添加经纬线

概述 前面的文章Node实现切片的拼接和地图的导出和Java实现地图的导出分别讲述可如何在node和java中实现切片的拼接以及地图的导出。本文&#xff0c;书接前文&#xff0c;实现java导出时经纬度的添加。 实现后效果 实现 完整的实现思路流程如下图&#xff1a; 1. 根据切片…

什么是Makefile?如何编写Makefile?

&#x1f947;今日学习目标&#xff1a;什么是Makefile&#xff1f;如何编写Makefile&#xff1f; &#x1f935;‍♂️ 创作者&#xff1a;JamesBin ⏰预计时间&#xff1a;10分钟 &#x1f389;个人主页&#xff1a;嵌入式悦翔园个人主页 &#x1f341;专栏介绍&#xff1a;L…