317. 多关键字排序

在这里插入图片描述

/*
 * Copyright (c) Huawei Technologies Co., Ltd. 2024-2024. All rights reserved.
 */

package ahwoj;

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

/**
 * 题目说排序关键字优先级依次降低,那就是说,排序关键字序列中,后面的元素得先排序,否则会被后续排序关键字排序结果覆盖,优先级高的不能被覆盖。
 */
public class MutiKeySort317 {
    public static void mutiKeySort(int m, int n, int[] keys, List<ArrayList<Integer>> list) {
        // Collections.sort(list, (o1, o2) -> {
        //     for(int i = 0; i < o1.size(); i++) {
        //         if (o1.get(i) != o2.get(i)) {
        //             return (o1.get(i) - o2.get(i)) * keys[i];
        //         }
        //     }
        //     return 0;
        // });
        // Collections.sort(list, new Comparator<ArrayList<Integer>>() {
        //         @Override
        //         public int compare(ArrayList<Integer> o1, ArrayList<Integer> o2) {
        //             for(int i = 0; i < o1.size(); i++) {
        //                 if (o1.get(i) == o2.get(i)) {
        //                     continue;
        //                 }
        //                 return (o1.get(i) - o2.get(i)) * keys[i];
        //             }
        //             return 0;
        //         }
        //     });
        list.sort(new Comparator<ArrayList<Integer>>() {
            @Override
            public int compare(ArrayList<Integer> o1, ArrayList<Integer> o2) {
                for(int i = 0; i < o1.size(); i++) {
                    if (o1.get(i) == o2.get(i)) {
                        continue;
                    }
                    return (o1.get(i) - o2.get(i)) * keys[i];
                }
                return 0;
            }
        });
    }

    public static void main(String[] args) {
        // 输入list
        Scanner scanner = new Scanner(System.in);
        String[] mn = scanner.nextLine().split(" ");
        int n = Integer.parseInt(mn[0]);
        int m = Integer.parseInt(mn[1]);
        int[] keys = new int[m];
        String[] keysStr = scanner.nextLine().split(" ");
        List<ArrayList<Integer>> list = new ArrayList<>();
        for (int i = 0; i < m; i++) {
            keys[i] = Integer.parseInt(keysStr[i]);
        }
        for (int i = 0; i < n; i++) {
            ArrayList<Integer> array = new ArrayList<>();
            String[] arrayStr = scanner.nextLine().split(" ");
            for (int j = 0; j < m; j++) {
                array.add(Integer.parseInt(arrayStr[j]));
            }
            list.add(array);
        }
        // 排序
        mutiKeySort(m, n, keys, list);
        // 输出
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                System.out.print(list.get(i).get(j));
                if (j != m-1) {
                    System.out.print(" ");
                } else {
                    System.out.println();
                }
            }
        }
    }
}

参考:

/*
 * Copyright (c) Huawei Technologies Co., Ltd. 2024-2024. All rights reserved.
 */

package kexin;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Scanner;

/**
 * 第一行两个整数n,m(m<=10,n<=100000),分别表示有n个需要排序的元素,每个元素有m个排序关键字,优先级依次降低。 第二行m个整数(均为1或-1),每个整数ai表示第i个关键字按升序(1)或是降序排列(-1)。
 * 接下来n行,每行m个整数,表示每个元素的m个关键字。
 *
 * @since 2024-02-18
 */
public class OJ317 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String firstLine = sc.nextLine();
        String[] a1 = firstLine.split(" ");
        int n = Integer.parseInt(a1[0]);
        int m = Integer.parseInt(a1[1]);

        // 排序条件
        String orderLine = sc.nextLine();

        // 普通排序做法
        lsstSort(sc, n, m, orderLine);

        // 优先队列也可以,添加进来就带有顺序,直接输出即可
        queueSort(sc, n, m, orderLine);
    }

    private static void queueSort(Scanner sc, int n, int m, String orderLine) {
        String[] order = orderLine.split(" ");
        // 优先队列和多条件排序是一样的,相当于在添加的时候已经制定顺序,类似插入排序
        Queue<int[]> queue = new PriorityQueue<>(new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                for (int i = 0; i < o1.length; i++) {
                    // 如果相等比较下一个列元素
                    if (o1[i] == o2[i]) {
                        continue;
                    }
                    // o1- o2 直接返回就是默认升序,乘-1就变成逆序
                    return (o1[i] - o2[i]) * Integer.parseInt(order[i]);
                }
                return 0;
            }
        });
        // 添加数据
        while (n > 0) {
            String[] tmp = sc.nextLine().split(" ");
            int[] line = new int[m];
            for (int i = 0; i < m; i++) {
                line[i] = Integer.parseInt(tmp[i]);
            }
            queue.add(line);
            n--;
        }
        while (!queue.isEmpty()) {
            printArray(queue.poll());
        }
    }

    private static void lsstSort(Scanner sc, int n, int m, String orderLine) {
        List<int[]> data = new ArrayList<>();
        while (n > 0) {
            String[] tmp = sc.nextLine().split(" ");
            int[] intArray = new int[m];
            for (int i = 0; i < m; i++) {
                intArray[i] = Integer.parseInt(tmp[i]);
            }
            data.add(intArray);
            n--;
        }

        sort(data, orderLine);
    }

    public static void sort(List<int[]> lsst, String orderLine) {
        String[] order = orderLine.split(" ");
        lsst.sort(new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                for (int i = 0; i < o1.length; i++) {
                    if (o1[i] == o2[i]) {
                        continue;
                    }
                    return (o1[i] - o2[i]) * Integer.parseInt(order[i]);
                }
                return 0;
            }
        });

        for (int[] aa : lsst) {
            printArray(aa);
        }
    }

    private static void printArray(int[] aa) {
        StringBuilder sb = new StringBuilder();
        Arrays.stream(aa).forEach(i -> sb.append(" ").append(i));
        System.out.println(sb.substring(1));
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C 语言 ConsoleRogueLike 控制台肉鸽游戏 DEVC++ VS2022都可用

使用 C 语言和 windows 的键盘检测函数和延迟函数&#xff0c;开发的控制台 roguelike 游戏 点开 .exe 文件立即进入游戏 AWSD 移动 J 攻击 K 加成buff 没有结束条件&#xff0c;除非碰到敌人。 其他模块功能还没来得及开发 author : 民用级脑的研发记录 DEVC 项目工程代码副本…

【机构vip教程】Appium自动化(2):Python+Appium环境搭建

windows下搭建pythonappium环境 搭建过程步骤如下&#xff1a; 1、安装jdk并配置好环境变量&#xff08;jdk版本1.8以上&#xff09; 2、安装android-sdk并配置好环境变量&#xff1b;具体步骤见&#xff1a;https://www.cnblogs.com/YouJeffrey/p/15243705.html 3、安装安…

是面试官放水,还是公司实在是太缺人?,字节原来这么容易进...

字节是大企业&#xff0c;是不是很难进去啊&#xff1f;” “在华为做软件测试&#xff0c;能得到很好的发展吗&#xff1f; 一进去就有19.5K&#xff0c;其实也没有想的那么难” 直到现在&#xff0c;心情都还是无比激动&#xff01; 本人211非科班&#xff0c;之前在华为…

嵌入式学习-C++-Day6

思维导图 作业 以下是一个简单的比喻&#xff0c;将多态概念与生活中的实际情况相联系&#xff1a; 比喻&#xff1a;动物园的讲解员和动物表演 想象一下你去了一家动物园&#xff0c;看到了许多不同种类的动物&#xff0c;如狮子、大象、猴子等。现在&#xff0c;动物园里有一…

3年,5年,10年,网工人必看!

你们好&#xff0c;我是老杨。 2023年的职场上&#xff0c;无数人在思考“什么时候才能提前退休”这个问题。 对很多底层网工来说&#xff0c;二三十岁的年纪&#xff0c;距离60岁退休还有30年左右&#xff0c;是不是会觉得有点遥遥无期&#xff0c;毫无盼头&#xff1f; 现…

物奇平台ENC算法开关接口修改方法

物奇ENC算法开关接口修改 是否需要申请加入数字音频系统研究开发交流答疑群(课题组)?可加我微信hezkz17, 本群提供音频技术答疑服务,+群赠送语音信号处理降噪算法,蓝牙耳机音频,DSP音频项目核心开发资料, 1 配置工具 2 代码接口

Ansible fetch 模块 该模块用于从远程某主机获取(复制)文件到本地

这里写目录标题 参数实例查看返回结果在这里插入图片描述 参数 dest&#xff1a;用来存放文件的目录 src&#xff1a;在远程拉取的文件&#xff0c;并且必须是一个file&#xff0c;不能是**目录* 实例 ansible slave -m fetch -a src/data/hello.txt dest/data/可以看到一个…

2024年【安全员-C证】报名考试及安全员-C证考试资料

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全员-C证报名考试参考答案及安全员-C证考试试题解析是安全生产模拟考试一点通题库老师及安全员-C证操作证已考过的学员汇总&#xff0c;相对有效帮助安全员-C证考试资料学员顺利通过考试。 1、【多选题】《工伤保险…

软件实例分享,台球厅收费系统电脑桌球店计时软件及灯控线路图教程

软件实例分享&#xff0c;台球厅收费系统电脑桌球店计时软件及灯控线路图教程 一、前言 以下软件程序教程以 佳易王桌球室计时计费软件V17.0为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、每个桌子对应的有 开台时间&#xff0c;所用的时…

java数据结构与算法刷题-----LeetCode594. 最长和谐子序列

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 解题思路 子序列要尽可能长&#xff0c;并且最大值和最小值之间的差&#…

Python教程(27)——如何使用Python中的上下文管理器

当我们在编写代码时&#xff0c;经常会遇到需要管理资源的情况&#xff0c;比如打开和关闭文件&#xff0c;如果遇到了一些异常情况&#xff0c;我们需要关闭资源&#xff0c;不然会导致资源泄露&#xff0c;虽然我们可以通过手动的方式来关闭&#xff0c;但如果有多个异常情况…

基于Springboot的新能源充电系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的新能源充电系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&a…

MyBatisPlus 整合 SpringBoot 遇见的问题

【异常】&#xff1a;Cause: java.sql.SQLSyntaxErrorException: Unknown column ‘udf1’ in ‘field list’… SQL: SELECT id,oper_id,btch_id,udf1, FROM scan_cyber Cause: java.sql.SQLSyntaxErrorException: Unknown column ‘udf1’ in ‘field list’; ,"messag…

OpenHarmony—UIAbility组件与UI的数据同步

基于HarmonyOS的应用模型&#xff0c;可以通过以下两种方式来实现UIAbility组件与UI之间的数据同步。 使用EventHub进行数据通信&#xff1a;基于发布订阅模式来实现&#xff0c;事件需要先订阅后发布&#xff0c;订阅者收到消息后进行处理。使用globalThis进行数据同步&#…

PostgreSQL Error Codes (PostgreSQL错误代码)

Whats PostgreSQL Error Codes PostgreSQL服务器发出的所有消息都分配了五个字符的错误代码&#xff0c; 这些代码遵循 SQL 的"SQLSTATE"代码的约定。 需要知道发生了什么错误条件的应用程序通常应该检测错误代码&#xff0c;而不是查看文本错误消息。 这些错误代码…

Flink介绍

Flink 介绍 文章目录 Flink 介绍1. 简介1.1 背景1.2 用途 2. 核心概念2.1 流&#xff08;Stream&#xff09;2.2 转换&#xff08;Transformation&#xff09;2.3 窗口&#xff08;Window&#xff09;2.4 状态&#xff08;State&#xff09; 3. 编程模型3.1 编程模型介绍3.2 程…

Selenium Grid分布式测试环境搭建

Selenium Grid简介 Selenium Grid实际上是基于Selenium RC的&#xff0c;而所谓的分布式结构就是由一个hub节点和若干个node代理节点组成。Hub用来管理各个代理节点的注册信息和状态信息&#xff0c;并且接受远程客户端代码的请求调用&#xff0c;然后把请求的命令转发给代理节…

ansible自动化运维工具及常见模块的使用

目录 一、ansible概述 二、ansible的特性 三、ansible 环境安装部署 管理端安装 ansible&#xff1a; 配置主机清单&#xff1a; 配置密钥对验证&#xff1a; 四、ansible 常见模块的使用 1&#xff0e;command 模块 2&#xff0e;shell 模块 3&#xff0e;cron 模块…

JS进阶——垃圾回收机制以及算法

版权声明 本文章来源于B站上的某马课程&#xff0c;由本人整理&#xff0c;仅供学习交流使用。如涉及侵权问题&#xff0c;请立即与本人联系&#xff0c;本人将积极配合删除相关内容。感谢理解和支持&#xff0c;本人致力于维护原创作品的权益&#xff0c;共同营造一个尊重知识…

Typora+PicGO+腾讯云COS做图床

文章目录 Typora&#xff0b;PicGO&#xff0b;腾讯云COS做图床一、为什么使用图床二、Typora、PicGO和腾讯云COS介绍三、下载Typora和PicGOTyporaPicGO 四、配置Typora、PicGO和腾讯云COS腾讯云COS配置PicGO配置Typora配置 Typora&#xff0b;PicGO&#xff0b;腾讯云COS做图床…