笔记--java sort() 方法排序

news2025/1/16 4:50:24

背景


最近在刷一道算法题 《字符串重新排序》时,发现自己有思路但是写代码的时候就无从下手了 而且看了答案之后还没看懂 关键就是基础不好 对于排序没有理解(虽然我学过常用的排序算法 但是都是理念 实践少)

目的


从实践和原理出发 重点是从实践出发 探讨如何使用 sort()方法 完成复杂的排序

能掌握到的知识

  1. 了解compaer(O1 ,O2) 中 返回1 -1 0 这三个什么意思 并且如何使用这三个值达到自己想要的排序
  2. 如何实现组合排序 即满足排序1情况下进行排序2

目录

  1. sort() 方法 简介
  2. sort() 方法使用
  3. 实战

sort()方法简介


sort()方法有很多种

  1. Arrays.sort()
    在这里插入图片描述
  2. public void sort(java.util.Comparator<? super E> c )
    在这里插入图片描述
    本次主要讨论的是第二种情况 并且是实现Comparator接口最简单的形式:

通过返回 1 0 -1 等三个数 比较列表中对象属性值的方法 实现的排序

如下所示

  userList.sort((o1,o2) ->{
            if (o1.getAge() > o2.getAge()) {
                //降序
                return -1;
            } else if (o1.getAge() < o2.getAge()) {
                return 1;
            } else {
                return 0;
            }

        });

sort()方法的使用


那1 0 -1 分别代表什么呢 怎么比较能够实现升序降序呢

PS:这里并不一定是1 和-1 只要是负整数和正整数就行了 只不过我们习惯上用1和-1表示
放两个结论

  1. 三个数代表的意思
    • 1:代表保持原样
    • 0:代表保持原样
    • -1:需要交换顺序
  2. 在排序前 o2 在o1前面

所以

  • 升序:
    • o1 > o2 时:前者比后者小 数越来越大 未排列前就是升序 不需要交换顺序 所以返回1或者0
    • o1 < o2 时: 前者比后者大 数越来越小 未排列前就是降序 需要交换顺序 返回 - 1

降序你可以自己总结 下面我们实战演示一下

1. 单个属性的排序要求


给出测试数据

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {

    private int age;

    private int high;

    private String name;


  
}

例子

  public static void main(String[] args) {
        List<User> userList = new ArrayList<>();
        userList.add(new User(18, 165,"张三1"));
        userList.add(new User(16, 177, "张三11"));
        userList.add(new User(25, 189, "张三4"));
        userList.add(new User(25, 167,"张三3"));
        userList.add(new User(16, 155, "张三8"));


        userList.sort((o1,o2) ->{
            if (o1.getAge() > o2.getAge()) {
                //降序
                return -1;
            } else if (o1.getAge() < o2.getAge()) {
                // 降序
                return 0;
            } else {
                return 0;
            }

        });

//        userList.sort((o1,o2) ->{
//            if (o1.getAge() < o2.getAge()) {
//                //升序
//                return -1;
//            } else if (o1.getAge() > o2.getAge()) {
//                return 0;
//            } else {
//                return 0;
//            }
//
//        });
        System.out.println("userList = " + userList);
    }
  1. 第一个if 中 判断条件表示 年龄 越来越大 但是要返回-1 即交换顺序 所以是降序
  2. 第二个if中 判断条件表示 年龄 越来越小 返回1 即顺序不变 所以是升序

2. 组合排序


很多时候我们可能并不是只按一个属性进行排序 比如以下要求

  1. 先按照年龄升序
  2. 再按照身高降序
 public static void main(String[] args) {
        List<User> userList = new ArrayList<>();
        userList.add(new User(18, 165,"张三1"));
        userList.add(new User(16, 177, "张三11"));
        userList.add(new User(25, 189, "张三4"));
        userList.add(new User(25, 167,"张三3"));
        userList.add(new User(16, 155, "张三8"));

        userList.sort(((o1, o2) -> {
            //按照年龄升序
            if (o1.getAge() > o2.getAge()) {
                //后面的大于前面的数 数越来越大 即升序 所以不需要交换顺序
                return 1;
            } else if (o1.getAge() < o2.getAge()) {
                // 后面的小于前面的数 数越来越小 即降序 但是我们想要升序 所以需要交换顺序 返回-1
                return -1;
            } else {
                //相等时 按照身高降序
                if (o1.getHigh() > o2.getHigh()) {
                    // 后面的大于前面 即数越来越大 升序 但是我们想要降序 所以返回-1
                    return -1;

                } else if (o1.getHigh() < o2.getHigh()) {
                    return 1;
                } else {
                    return 0;
                }
            }
        }));


        System.out.println("userList = " + userList);
    }

实战


题目描述
有一串单词组成的英文字符串 需要下面要求进行排序

  1. 统计每个单词出现的次数,并按次数降序排列;
  2. 次数相同时,按单词长度升序排列;
    3)次数和单词长度均相同时,按字典序升序排列

举例

示例1

输入:
	This is an apple
输出:
	an is This apple

示例2

输入 
	Wisdom in the mind is better than money in the hand
输出
	in in the the is hand mind than money Wisdom better

代码

public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String originString = scanner.nextLine();

        //1. 获取全部
      List<String> list = new ArrayList<>(Arrays.asList(originString.split(" ")));



        //2. 统计每个单词出现的次数
        Map<String, Long> countMap = statistic(list);

        // 3. 排序
        List<Map.Entry<String, Long>> collect = countMap.entrySet().stream()
                .sorted(((o1, o2) -> {
                    if (o2.getValue() < o1.getValue()) {
                        // 降序
                        return -1;
                    } else if (o1.getValue().equals(o2.getValue())) {
                        if (o2.getKey().length() > o1.getKey().length()) {
                            // 升序 o2是后面那个
                            return -1;
                        } else if (o1.getKey().length() == o2.getKey().length()) {
                            return o1.getKey().compareTo(o2.getKey());
                        }
                    }
                    return 1;
                })).collect(Collectors.toList());

        //4. 根据key 和value次数输出结果
        StringBuilder builder = new StringBuilder();
        for (Map.Entry<String, Long> entry : collect) {
            Long value = entry.getValue();
            String key = entry.getKey();
            for (int i = 0; i < value.intValue(); i++) {
                builder.append(key).append(" ");
            }

        }

        System.out.println(builder.substring(0, builder.length() - 1).toString());

    }
    
       private static Map<String, Long> statistic(List<String> list) {


        	Map<String, Long> collect = list.stream()
                .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
        	return collect;

    }

我们主要关注第3点 排序那里的代码

参考:
CSDN博主「秃秃爱健身」的原创文章:https://blog.csdn.net/Saintmm/article/details/125218362

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

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

相关文章

参数处理、查询语句

一、Mybatis参数处理 1、数据准备 pojo类&#xff1a; public class Student {private Long id;private String name;private Integer age;private Double height;private Character sex;private Date birth;// constructor// setter and getter// toString }2、单个简单类型…

设计模式 -- 命令模式

前言 月是一轮明镜,晶莹剔透,代表着一张白纸(啥也不懂) 央是一片海洋,海乃百川,代表着一块海绵(吸纳万物) 泽是一柄利剑,千锤百炼,代表着千百锤炼(输入输出) 月央泽,学习的一种过程,从白纸->吸收各种知识->不断输入输出变成自己的内容 希望大家一起坚持这个过程,也同…

线性表详解

目录 1.线性表的定义和特点 2.案例 2.1一元多项式的计算 可以通过下面这个题目简单练习一下 2.2稀疏多项式的计算 2.3图书信息管理系统 3.线性表的类型定义 4.线性表的顺序表示和实现 4.1线性表的顺序储存表示 4.2顺序表中基本操作的实现 5.线性表的链式表现和实现 …

vba:inputbox

inputbox函数与方法 1.区别一&#xff1a;外观区别 InputBox 函数 在一对话框来中显示提示&#xff0c;等待用户输入正文或按下按钮&#xff0c;并返回包含文本框内容的 String。 Application.InputBox 方法 显示一个接收用户输入的对话框。返回此对话框中输入的信息。 -----…

分享一个国内使用的ChatGPT的方法

介绍 ChatGPT ChatGPT是一种基于自然语言处理技术的对话生成模型。它是由OpenAI公司开发的一种语言模型&#xff0c;可以在大规模语料库上进行无监督学习&#xff0c;并生成高质量的自然语言文本。ChatGPT可以用于多种应用场景&#xff0c;例如智能客服、语音助手、聊天机器人…

JAVA学习笔记(注解)

1. JDK预定义注解 (1) Deprecated&#xff08;表示标记对象已过时&#xff09; (2) SuppressWarnings("all") &#xff08;忽略标记对象的警告&#xff09; 2. 元注解&#xff08;用于描述注解的注解&#xff09; Target 描述注解所生效的位置 Retention 描述注…

SpringBooot

目录 一、简介 1、使用原因 2、JavaConfig &#xff08;1&#xff09;Configuration注解 &#xff08;2&#xff09;Bean注解 &#xff08;3&#xff09;ImportResource注解 &#xff08;4&#xff09;PropertyResource注解 &#xff08;5&#xff09;案例 3、简介 4…

Faster-RCNN代码解读8:代码调试与总结

Faster-RCNN代码解读8&#xff1a;代码调试与总结 前言 ​ 因为最近打算尝试一下Faster-RCNN的复现&#xff0c;不要多想&#xff0c;我还没有厉害到可以一个人复现所有代码。所以&#xff0c;是参考别人的代码&#xff0c;进行自己的解读。 ​ 代码来自于B站的UP主&#xff0…

网络协议-前端重点——DNS和CDN

目录 DNS的基础知识 统一资源定位符&#xff08;URL&#xff09;&#xff08;网址&#xff09; DNS&#xff08;Dimain Name System&#xff09;(域名系统) DNS Query过程 DNS记录 A记录 AAAA记录 CNAME记录&#xff08;Canonical Name Record&#xff09; MX记录&#…

Blender3.5 视图切换

目录 1. 数字小键盘切换视图1.1 正交顶视图1.2 正交前视图1.3 正交右视图1.4 透视图1.5 四格视图 2. 鼠标点击切换视图2.1 点击视图&#xff0c;根据需求选择对应视图2.2 点导航栏的坐标轴切换 3. 启用字母区数字键3.1 编辑——偏好设置——输入——勾选“模拟数字键” 1. 数字…

Linux驱动——高级I/O操作(四)

目录 几种I/O模型总结 异步通知 几种I/O模型总结 阻塞 IO:在资源不可用时&#xff0c;进程阻塞&#xff0c;阻塞发生在驱动中&#xff0c;资源可用后进程被唤醒,在阻塞期间不占用CPU&#xff0c;是最常用的一种方式。 非阻塞 I/O: 调用立即返回&#xff0c;即便是在资…

《Unity Shader 入门精要》第10章 高级纹理

第10章 高级纹理 10.1 立方体纹理 在图形学中&#xff0c;立方体纹理 &#xff08;Cubemap&#xff09; 是环境映射 &#xff08;Environment Mapping&#xff09; 的一种实现方法。 和之前见到的纹理不同&#xff0c;立方体纹理一共包含了6张图像&#xff0c;这些图像对应了…

typescript的keyof的用法

第一种&#xff1a;与接口一起用&#xff0c;返回联合类型 interface Person {name: string;age: number;location: string;}type K1keyof Person; // "name" | "age" | "gender" let a:K1name 第二种&#xff1a;与typeof一起用&#xff0c;可…

天梯赛练习(L2-013 ~ L2-020)

L2-013 红色警报 战争中保持各个城市间的连通性非常重要。本题要求你编写一个报警程序&#xff0c;当失去一个城市导致国家被分裂为多个无法连通的区域时&#xff0c;就发出红色警报。注意&#xff1a;若该国本来就不完全连通&#xff0c;是分裂的k个区域&#xff0c;而失去一…

【springcloud开发教程】负载均衡——Ribbon

Ribbon是什么&#xff1f; Spring Cloud Ribbon 是基于Netflix Ribbon 实现的一套客户端负载均衡的工具。简单的说&#xff0c;Ribbon 是 Netflix 发布的开源项目&#xff0c;主要功能是提供客户端的软件负载均衡算法&#xff0c;将 Netflix 的中间层服务连接在一起。Ribbon 的…

CentOS7安装docker以及docker-compose

前言 系统版本&#xff1a;CentOS7.9 docker版本&#xff1a;当前最新版本是23.0.3 docker compose版本&#xff1a;v2.17.2 参考官网文档&#xff1a;跳转链接 安装docker 删除原有的docker&#xff08;如果有的话&#xff09; sudo yum remove docker \docker-client …

CSAPPLab1-DataLab

1、bitXor 异或&#xff1a;不是同时为0和不是同时为1的情况进行按位与 /** bitXor - x^y using only ~ and &* Example: bitXor(4, 5) 1* Legal ops: ~ &* Max ops: 14* Rating: 1*/int bitXor(int x, int y) {return ~(~x & ~y) & ~(x & y); } …

可鉴别加密工作模式-同时保护数据机密性和完整性(OCB、CCM、KeyWrap、EAX和GCM)第一部分

当算法用于同时保护数据的机密性和完整性时&#xff0c;应选取合适的可鉴别加密工作模式&#xff0c;例如OCB、CCM、KeyWrap、EAX和GCM等工作模式。以下总结来自GBT36624-2018国标文本。 在可鉴别加密工作模式之前&#xff0c;先来说说分组密码的工作模式可参考GBT17964-2021版…

反欺诈(羊毛盾)API 实现用户行为分析的思路分析

简介 反欺诈&#xff08;羊毛盾&#xff09;API 是一种用于识别和防范各种欺诈行为的技术解决方案。它可集成到各种应用程序和平台中&#xff0c;通过手机号码、手机IP进行异常检测&#xff0c;达到防范恶意注册、虚假评论、虚假交易等欺诈行为的目的。 本文主要介绍反欺诈&a…

1677_MIT 6.828 xv6中增加CPU alarm

全部学习汇总&#xff1a; GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 前面把课程要求做了一个简单的翻译&#xff0c;从课程的要求说明中其实已经能够得到很多的提示。这个alarm的功能&#xff0c;其实有点类似回调函数的概念&#xf…