Java 8 之 Stream sorted() List排序并排名

JavaList 集合,通过 Stream 流进行排序总结 【代码】JavaList 集合,通过 Stream 流进行排序总结。 阅读详情

Java 8 之 Stream sorted() List排序并排名

1.排序

1.1元素正排序

list = list.stream()
                .sorted(Comparator.comparing(Person::getAge))
                .collect(Collectors.toList());

1.2元素逆排序(reversed())

list = list.stream()
                .sorted(Comparator.comparing(Person::getAge).reversed())
                .collect(Collectors.toList());

2.List排名并获取名次示例

import lombok.Data;
import java.util.*;
import java.util.stream.Collectors;
public class RankTest {
    public static void main(String[] args) {
        List<Person> list = new ArrayList<Person>() {{
            add(new Person(10, "北京"));
            add(new Person(10, "西安"));
            add(new Person(20, "呼市"));
            add(new Person(20, "上海"));
            add(new Person(40, "南京"));
            add(new Person(60, "青海"));
        }};
        //从小到大正序
        list = list.stream()
                .sorted(Comparator.comparing(Person::getAge))
                .collect(Collectors.toList());
          //从大到小逆序
      //  list = list.stream()
        //        .sorted(Comparator.comparing(Person::getAge).reversed())
          //      .collect(Collectors.toList());
          //从大到小
//        list.sort((s1, s2) -> -Double.compare(s1.getAge(), s2.getAge()));

        int index = 0;
        double lastAge = -1;
        /**
         * 方法1: 出现并列排名后名次不间断
         */
        for (Person bean : list) {
            if (Double.compare(lastAge, bean.getAge()) != 0) {
                lastAge = bean.getAge();
                index++;
            }
            bean.setRank(index);
        }

        /**
         * 方法2.1: 出现并列排名后名次间断,后续名次按实际数据位置累计
         */
        //        for (int i = 0; i < list.size(); i++) {
//            if (list.get(i).getAge() == lastAge ){
//                list.get(i).setRank(index);
//                if (i + 1 < list.size() && list.get(i + 1).getAge() !=  lastAge){
//                    index = i + 1 ;
//                }
//            }else{
//                list.get(i).setRank(++index);
//            }
//            lastAge = list.get(i).getAge();
//        }

        /**
         * 方法2.2: 出现并列排名后名次间断,后续名次按实际数据位置累计(业务在name唯一的前提下使用)
         */
//        Map<String, Integer> rankMap = new HashMap<>();
//        for (int i = 1; i <= list.size(); i++) {
//            if (i != 1) {
//                if (list.get(i - 1).getAge().equals(list.get(i - 2).getAge())) {
//                    rankMap.put(list.get(i - 1).getName(), rankMap.get(list.get(i - 2).getName()));
//                } else {
//                    rankMap.put(list.get(i - 1).getName(), i);
//                }
//            } else {
//                rankMap.put(list.get(0).getName(), i);
//            }
//        }
//        for (Person person : list) {
//            person.setRank(rankMap.get(person.getName()));
//        }

        //打印结果
        list.forEach(p -> {
            System.out.println(p);
        });

    }
}

@Data
class Person {
    private Integer age;
    private Integer rank;
    private String name;

    public Person(Integer age, String name) {
        this.age = age;
        this.name = name;
    }

}

2.方法1结果示例

在这里插入图片描述

2.方法2.1结果示例

在这里插入图片描述

2.方法2.2结果示例

在这里插入图片描述

最后

欢迎指正

Java集合排序:Comparator接口详解与实战技巧 Java编程中,集合排序是数据处理的基础操作。Comparator接口作为外部比较器,通过实现compare方法定义对象间的比较逻辑,支持灵活的多条件排序。相比Comparable接口,Comparator遵循开闭原则,无需修改原有类即可实现多种排序规则。从技术实现看,Comparator与Java 8的Lambda表达式结合能大幅简化代码,同时支持null值处理、排序等高级特性。在实际开发中,电商商品排序、学生成绩排名等场景都依赖Comparator实现复杂业务逻辑。通过合理使用Comparator 阅读详情

相关推荐

Java排序核心:Comparable与Comparator职责边界详解

Java集合排序中,Comparable和Comparator共同构成对象比较的底层机制。Comparable定义对象的自然顺序,强调唯一性、稳定性和数学一致性,适用于ID、时间戳等不可变标识;Comparator则提供外部、动态、多维度的场景化排序能力,支持Lambda链式组合与运行时策略切换。二者协同实现高内聚低耦合的设计目标,在Spring Data、MyBatis等主流框架中被广泛集成。掌握其差异不仅关乎代码正确性(如避免ClassCastException、TreeSet崩溃),更直接影响系统可

weixin_30897079的博客 390

List两种排序方法,sort,stream

Subject subject1 = new Subject("语文", 91.0); Subject subject2 = new Subject("语文", 94.0); Subject subject3 = new Subject("语文", 92.0); Subject subject4 = new Subject("语文",...

Top5软件工程硕士,先后在京东、字节从事多年Java后端开发、实时和离线大数据开发 4万+

Redis数据结构深度解析:从底层编码到内存优化的40张图解

数据结构是计算机科学的核心基础,它定义了数据的组织、存储和操作方式,直接影响程序的性能和资源消耗。在数据库与缓存系统中,高效的数据结构设计是实现低延迟、高发访问的关键。Redis作为高性能键值数据库,其卓越性能的秘密正源于对数据结构的精妙运用。它非简单使用单一结构,而是通过动态编码机制,在内存空间与操作时间之间进行智能权衡。例如,Hash结构在元素较少时采用ziplist编码以节省内存,元素增多时自动转换为hashtable以保证操作效率;Set结构在元素均为整数时使用intset紧凑存储,遇到非整数则

CSDN头条 554

Java8 使用 stream().sorted()List集合进行排序

集合对象以学生类()为例,有学生的基本信息,包括:姓名,性别,年龄,身高,生日几项。使用stream().sorted()进行排序,需要该类实现Comparable接口,该接口只有一个方法需要实现,如下:Java 关于重写compareTo方法//名称 private String name;//性别 true男 false女 private Boolean gender;//年龄 private Integer age;//身高 private Double height;

LuckyTHP 2971

集合list使用stream.sorted的方式进行排序

集合list使用stream.sorted的方式进行排序

qq_42702331的博客 1万+

list.stream().sorted() Java8 Stream流的sorted()排序。正序、倒序、多字段排序

示例Bean以下我们会使用这个Bean来做示例。字段排序

hua_cheng的博客 1万+

Java必修课】一图说尽排序,一文细说Sorting(Array、ListStream排序)

简说排序 排序是极其常见的使用场景,因为在生活中就有很多这样的实例。国家GDP排名、奥运奖牌排名、明星粉丝排名等,各大排行榜,给人的既是动力,也是压力。 而讲到排序,就会有各种排序算法和相关实现,本文不讲任何排序算法,而只专注于讲使用。通过实例给大家展示,我们可以了解怎样使用既有的工具进行排序。Linux之父说: Talk is cheap. show me the code! 本文JDK...

南瓜慢说 809

java】浅谈java stream的使用(附带案例场景)

本文介绍了Java 8 Stream流式编程的核心概念和实战应用。主要内容包括:Stream的特点(惰性求值、一次性消费、不修改源数据)、创建方式(集合/数组/直接生成),以及丰富的中间操作(filter过滤、map转换、flatMap展开等)和终端操作(collect收集、reduce归约等)。文章通过Student实体类的10个典型场景演示了Stream的实际应用,如成绩统计、分组排序等,提供了完整操作流程图。最后还涉及行流优化和常见陷阱提示,帮助开发者掌握流式编程的核心技巧,提升代码简洁性和处理效

鲜衣怒马少年时,不负韶华行且知。 从第一个Hello World起,便踏上这条后端修行路。趟过分布式事务的浑水,翻过性能瓶颈的高山,方知代码如剑,需千锤百炼方显锋芒。 博客所记,皆为修行路上的顿悟与磕绊,愿与同道人共勉,稳步江湖。 347

List Stream sorted String类型按数值类型降序排序

【代码】List Stream sorted String类型按数值类型降序排序

world_the_begin的博客 790

基于Java与Spring Boot构建高发实时排名系统:从内存缓存到Redis实践

实时排名系统是游戏开发、赛事统计等场景中的核心组件,其本质在于对动态变化的数据集进行高效排序与快速查询。从技术原理上看,这类系统通常面临数据实时性、高发更新和精确排序等挑战。为实现毫秒级响应,工程实践中普遍采用“缓存+异步持久化”的混合架构,其中内存中的高效数据结构(如跳表)负责实时排名计算,数据库则作为持久化存储保障数据可靠性。这种架构的技术价值在于,它通过将计算密集型操作前置到缓存层,显著降低了数据库的排序压力,从而支撑起高发的积分更新与排名查询。在应用场景上,无论是电竞联赛积分榜、直播打赏排行榜,

weixin_34275734的博客 439

Java集合排序:Comparator核心用法与实战技巧

Java集合操作中,排序是常见且关键的技术需求。Comparator作为外部比较器,通过实现compare方法定义元素间的排序规则,解决了类无法修改或需要多维度排序的业务场景。相比Comparable接口,Comparator提供了更灵活的排序控制,支持多条件组合、null值处理和自定义逻辑等高级特性。Java 8引入的Lambda表达式和方法引用进一步简化了Comparator的使用,结合Stream API可以实现声明式的数据排序。在电商商品排序、学生成绩排名等实际应用中,合理使用Comparator

weixin_34310369的博客 404

Java入门到精通-21 集合框架新特性与实战——Java 9-21集合增强

本文介绍了Java 9-21版本中集合框架的重要新特性,主要包括: 不可变集合工厂方法(Java 9+) 通过List.of()、Set.of()、Map.of()等简洁方式创建不可变集合 不可变集合天然线程安全,避免副作用,不允许null值 提供了内存优化和序列化支持 SequencedCollection接口(Java 21) 统一了有序集合的操作方式 提供addFirst()、getLast()等标准方法 支持reversed()方法获取反转视图 集合增强方法 结合Stream API进行函数式操作

weixin_56693899的博客 310

网易Java校招笔试通关攻略:基础、集合与排序实战解析

Java语言的核心竞争力,往往体现在对基础语法、集合容器与函数式编程的深入理解上。面向对象设计、HashMap的底层扩容机制、Lambda表达式与Stream流式操作,以及Comparator多条件排序,都是大厂笔试中高频出现的考点。理解这些概念的运行原理,不仅能应对选择题的细节辨析,更能帮助工程师在真实项目里写出简洁、健壮的代码。当面对“按薪资降序、入职日期升序”这类业务场景时,借助Java 8的比较器链式调用和List.sort,即可高效完成排序与格式化输出。这种从基础原理到工程实践的思维方式,正是校招

weixin_30256901的博客 392

Redis:数据库语法速查表 / 全景梳理

数据类型一句话用途常用命令典型场景String最通用的键值对缓存、计数器、分布式锁Hash对象存储用户信息、商品信息List有序列表消息队列、最新列表Set去重集合标签、共同好友、抽奖Sorted Set带排序的集合排行榜、延迟队列Bitmap位操作签到、在线状态基数统计UV 统计GEO地理空间附近的人Stream持久化消息队列可靠消息队列事务批量原子执行转账、库存扣减Lua 脚本复杂原子操作限流、分布式锁(复杂版)Pipeline批量命令(减少网络往返)客户端支持。

snow的博客 443

游戏流水数据监控系统:从实时采集到跨地区排名计算

游戏流水数据是衡量游戏商业表现的核心指标,涵盖应用内购买、道具销售等所有付费行为的总和。其计算原理基于实时营收金额、增长率、付费率等多维度因素,通过流处理技术实现分钟级更新。在技术价值层面,准确的流水监控能帮助开发者优化运营策略,提升营收效率。特别是在跨服架构设计中,需要解决时区差异、货币汇率换算等数据同步挑战。本文以《异环》游戏为例,详细介绍了基于Kafka、Redis的技术栈搭建,以及如何通过地区权重算法实现多平台排名聚合,为游戏数据分析提供完整的工程实践方案。

anvt77205的博客 502

一篇文章带你了解Redis数据类型

Redis作为高性能键值存储(缓存/数据库),其数据类型设计是“高性能+多场景适配”的核心,也是面试高频考点、业务开发必备技能。本文将分「核心数据类型」「拓展数据类型」两大模块,讲透每个类型的特点、常用命令、实战场景,附加记忆技巧,帮你快速掌握~

2402_83493359的博客 953

从‘合影效果’题看信息学竞赛中的排序思维:不止是sort一下那么简单

本文深入探讨了信息学竞赛中多条件排序的高阶思维,以‘合影效果’题为例,分析了从自然语言到计算机指令的转化艺术。通过比较分而治之策略与统一排序方法的优劣,揭示了在NOI等竞赛中如何高效处理复杂排序问题。文章还提供了电商商品排序、学生成绩排名等实战案例,帮助读者掌握多条件排序的精髓与应用技巧。

weixin_30607029的博客 375

OC管理系统开发实战:从角色数据建模到多维度排序算法

角色数据管理是内容创作和游戏开发中的基础技术概念,其核心原理在于构建灵活的数据模型来存储复杂的关系网络。通过权重算法和状态机设计,系统能够实现多维度的智能排序,这种技术方案在原创角色管理、社交关系分析等场景中具有重要价值。本文基于Spring Boot和Vue.js的工程实践,详细展示了如何构建完整的OC管理系统,重点解决了角色关系建模和排序算法实现等核心问题,其中涉及的数据表设计和RESTful API架构为开发者提供了实用的参考方案。

weixin_30596735的博客 418
Coder_Chicken
博客等级 码龄8年 0粉丝 1原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值