当前位置: 首页 > news >正文

【JAVA】中文我该怎么排序?


📘 Java 中文排序教学文档(基于 Collator)


🧠 目录

  1. 概述
  2. Java 中字符串排序的默认行为
  3. 为什么需要 Collator
  4. 使用 Collator 进行中文排序
  5. 升序 vs 降序排序
  6. 自定义对象字段排序
  7. 多字段排序示例
  8. 总结对比表
  9. 附录:完整代码示例

1. 📌 概述

Java 的 List.sort() 方法通过传入一个比较器(Comparator),决定集合中元素的排列顺序。但 Java 默认的字符串比较并不能正确排序中文(尤其是按拼音顺序),这就需要使用 Collator 来实现符合中文语义的排序方式。


2. 🔍 Java 中字符串排序的默认行为

Java 默认使用 Unicode 编码值 进行字符串比较:

List<String> list = Arrays.asList("张三", "李四", "王五");
Collections.sort(list); // 默认排序方式

此时的排序结果可能是乱码或者无意义的顺序,因为它只是按字符的 Unicode 值排列。


3. ❓ 为什么需要 Collator

java.text.Collator 是 Java 提供的 本地化字符串比较工具类,支持中文、日文、韩文等语言规则的比较。

使用 Collator 可以实现:

  • 按拼音排序(中文首字母)
  • 支持不同 Locale(本地语言规则)

4. ✅ 使用 Collator 进行中文排序

基本示例:

import java.text.Collator;
import java.util.*;public class ChineseSortExample {public static void main(String[] args) {List<String> names = Arrays.asList("张三", "李四", "王五");Collator collator = Collator.getInstance(Locale.CHINA);names.sort(collator); // 升序:拼音 A → ZSystem.out.println(names);}
}

5. 🔼 升序 vs 🔽 降序排序

升序(拼音从 A → Z):

list.sort((a, b) -> Collator.getInstance(Locale.CHINA).compare(a, b));

降序(拼音从 Z → A):

list.sort((a, b) -> Collator.getInstance(Locale.CHINA).compare(b, a));

记忆技巧compare(a, b) 表示“a 和 b 谁更小”,如果返回负数表示 a 更小,应该排前面;若返回正数表示 a 更大,应该排后面。


6. 🧾 自定义对象字段排序(按对象中的中文字段)

如果你有如下对象:

class Person {private String name;public String getName() { return name; }
}

你可以按 name 字段排序:

升序:

list.sort((o1, o2) ->Collator.getInstance(Locale.CHINA).compare(o1.getName(), o2.getName()));

降序:

list.sort((o1, o2) ->Collator.getInstance(Locale.CHINA).compare(o2.getName(), o1.getName()));

7. 🌈 多字段排序示例

如果你想先按姓名拼音降序,再按时间升序,可以这样写:

list.sort((o1, o2) -> {Collator collator = Collator.getInstance(Locale.CHINA);int nameCompare = collator.compare(o2.getName(), o1.getName()); // 姓名降序if (nameCompare != 0) return nameCompare;return o1.getCreateTime().compareTo(o2.getCreateTime()); // 时间升序
});

8. 📊 总结对比表

方式写法效果
默认排序Collections.sort(list)按 Unicode 排序,中文不正确
拼音升序compare(a, b)拼音 A → Z
拼音降序compare(b, a)拼音 Z → A
对象字段升序compare(o1.getField(), o2.getField())自定义字段排序
对象字段降序compare(o2.getField(), o1.getField())字段降序
多字段组合使用 if (result != 0) 判断后继续比较第二字段多条件排序

9. 🧪 附录:完整中文排序对象示例

import java.text.Collator;
import java.util.*;class User {private String commitUser;private Date commitTime;public User(String commitUser, Date commitTime) {this.commitUser = commitUser;this.commitTime = commitTime;}public String getCommitUser() { return commitUser; }public Date getCommitTime() { return commitTime; }@Overridepublic String toString() {return commitUser + " - " + commitTime;}
}public class ChineseSort {public static void main(String[] args) {List<User> users = new ArrayList<>();users.add(new User("李四", new Date(100000)));users.add(new User("王五", new Date(50000)));users.add(new User("陈七", new Date(150000)));users.sort((o1, o2) -> {Collator collator = Collator.getInstance(Locale.CHINA);int nameCmp = collator.compare(o2.getCommitUser(), o1.getCommitUser()); // 名字降序if (nameCmp != 0) return nameCmp;return o1.getCommitTime().compareTo(o2.getCommitTime()); // 时间升序});users.forEach(System.out::println);}
}

相关文章:

【JAVA】中文我该怎么排序?

&#x1f4d8; Java 中文排序教学文档&#xff08;基于 Collator&#xff09; &#x1f9e0; 目录 概述Java 中字符串排序的默认行为为什么需要 Collator使用 Collator 进行中文排序升序 vs 降序排序自定义对象字段排序多字段排序示例总结对比表附录&#xff1a;完整代码示例 …...

WPF MVVM Community Toolkit. Mvvm 社区框架

Community Toolkit. Mvvm 社区框架 微软官方文档 主要内容&#xff1a;CommunityToolkit.Mvvm 框架 概念&#xff0c;安装&#xff0c;使用&#xff08;重要API&#xff1a;ObservableObject&#xff0c;RelayCommand&#xff09;源生成器&#xff08;[ObservableProperty]&…...

云原生安全之PaaS:从基础到实践的技术指南

🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 云原生安全之PaaS:从基础到实践的技术指南 一、基础概念 PaaS(Platform as a Service)平台 PaaS是一种云计算服务模型,为开发者提供应用程序的开发、部署和运行环境,涵…...

软件设计师考试需背诵知识点

1. 网络技术标准与协议 2. OSI/RM七层模型 3. 对称加密算法 4. 常见的非对称加密算法 5. 排序算法比较 6. 海明码公式 设数据位是n位&#xff0c;校验位是k位&#xff0c;则n与k必须满足以下关系&#xff1a; 7. McCabe度量法 McCabe度量法的核心公式为&#xff1a; V(G)E−…...

智慧社区新防线:华奥系AI技术如何让夏季安防“零隐患”

夏季社区安防隐患频发 随着夏季高温、暴雨、台风等极端天气增多&#xff0c;社区安全风险显著上升。高空建筑外墙材料因暴晒脱落、地下管道锈蚀堵塞导致积水、电动车充电自燃等事件频发&#xff0c;传统“人防物防”模式响应滞后、管理粗放&#xff0c;难以满足精细化防控需求…...

pinia的简单使用

yarn add pinia // 用来存储token,用户信息&#xff0c;等需要多地方使用的信息 src目录下新建store文件夹->新建index.ts import { createPinia } from "pinia";const store createPinia()export default storemain.ts 引用store import { createApp } from v…...

【Linux笔记】——线程池项目与线程安全单例模式

&#x1f525;个人主页&#x1f525;&#xff1a;孤寂大仙V &#x1f308;收录专栏&#x1f308;&#xff1a;Linux &#x1f339;往期回顾&#x1f339;&#xff1a; 【Linux笔记】——简单实习一个日志项目 &#x1f516;流水不争&#xff0c;争的是滔滔不息 一、线程池设计二…...

用户有一个Django模型没有设置主键,现在需要设置主键。

用户有一个Django模型没有设置主键&#xff0c;现在需要设置主键。 from django.db import modelsclass CategoryAssistentModel(models.Model):second_level_category models.CharField(max_length100, nullTrue, blankTrue)third_level_category models.CharField(max_len…...

SkyWalking 报错:sw_profile_task 索引缺失问题分析与解决

文章目录 SkyWalking 报错&#xff1a;sw_profile_task 索引缺失问题分析与解决问题背景SkyWalking 是否会自动创建 sw_profile_task 索引&#xff1f;答案&#xff1a;不会在初始化时创建相关索引包括&#xff1a; 问题原因分析解决方案✅ 解决思路&#xff1a;手动创建 sw_pr…...

多模态学习笔记

在模态对齐任务中,同一时刻不同类型的数据(模态)需要做好对齐,才能更好的感知内容,下面对其常见的多模态对齐任务进行如下总结: (1)文本图像 图像和文本特征提取后的对齐方法主要分为两类:基于对比学习的方法和基于跨模态注意力的方法。以下是它们的细化说明及具体实…...

【 Redis | 实战篇 扩展 】

目录 前言&#xff1a; 1.达人探店功能 1.1.点赞功能 1.2.排行榜 2.关注 2.1.共同关注 2.2.关注推送 3.附近商铺 3.1.GEO基本用法 3.2.获取附近商铺 4.签到 4.1.BitMap 4.2.实现签到 4.3.统计连续签到 5.UV统计 前言&#xff1a; 实现达人探店&#xff0c;好友…...

【HarmonyOS Next之旅】DevEco Studio使用指南(二十五) -> 端云一体化开发 -> 业务介绍(二)

目录 1 -> 工作原理 2 -> 约束与限制 2.1 -> 支持的设备 2.2 -> 支持的国家/地区 2.3 -> 支持的签名方式 3 -> 总结 3.1 -> 关键功能与工具 3.2 -> 开发流程 3.3 -> 典型场景与优化 3.4 -> 常见问题与解决 3.5 -> 总结 1 -> 工…...

空调系统虚拟标定技术:新能源汽车能效优化的革命性突破

title: 空调系统虚拟标定技术&#xff1a;新能源汽车能效优化的革命性突破 date: 2025-05-15 categories: 新能源汽车技术 tags: [空调系统, 虚拟标定, PID控制, 数字孪生, 能效优化] description: 本文深度解析空调系统虚拟标定技术在新能源汽车中的应用&#xff0c;揭秘如何…...

MCP Server开发并使用自定义天气查询工具查询城市天气

1.本地安装node.js环境 2.本地创建mcp文件夹&#xff0c;搭建mcp环境 在文件夹下cmd执行npm init -y初始化npm项目 3.创建weather-server.js文件&#xff0c;代码如下 // weather-server.js import { McpServer } from "modelcontextprotocol/sdk/server/mcp.js"…...

virtualbox选项“启用套嵌vt-x/amd-v“不可用

“启用套嵌vt-x/amd-v”选项不可用。 解决方法&#xff1a; 切换到virtualbox安装目录&#xff0c;执行如下命令查看虚拟机名称&#xff1a; .\VBoxManage.exe list vms比如返回: winxp 执行如下命令开启64位&#xff0c;注意把"winxp"换成你的虚拟机名字&#x…...

windows powershell 判断 进程号是否存在

在 Windows PowerShell 中&#xff0c;你可以使用多种方法来检查一个特定的进程号&#xff08;PID&#xff09;是否存在。以下是几种常用的方法&#xff1a; 方法1&#xff1a;使用 Get-Process 命令 你可以尝试获取具有特定 PID 的进程。如果该进程存在&#xff0c;Get-Proce…...

JAVA SE 多线程(下)

文章目录 &#x1f4d5;1. 常见的锁策略✏️1.1 乐观锁VS悲观锁✏️1.2 轻量级锁VS重量级锁✏️1.3 自旋锁✏️1.4 公平锁VS非公平锁✏️1.5 可重入锁和不可重入锁✏️1.6 读写锁 &#x1f4d5;2. 死锁✏️2.1 哲学家就餐问题✏️2.2 形成死锁的必要条件✏️2.3 如何避免死锁 &…...

DeepSeek+Dify之九多模态大模型识别图片

Dify之八添加各种在线大模型 文章目录 背景整体流程测试数据用到的节点开始列表操作LLM结束实现步骤1、新建工作流2、开始节点3、列表操作4、LLM节点(多模态大模型检索)5、结束节点测试发布导出背景 有了上一篇文章的基础,现在可以了解下多模态大模型识别图片的工作流 整体…...

软件工程(七):MQTT协议

概念 特性描述协议类型应用层协议&#xff08;基于 TCP/IP&#xff09;通信模式发布/订阅&#xff08;Publish/Subscribe&#xff09;网络开销小报文头仅 2 字节起&#xff0c;非常轻量保持长连接使用 Keep Alive 机制&#xff0c;适合持续连接的设备面向物联网广泛用于智能家…...

网络 :网络基础【网络框架认识】

网络 &#xff1a;网络基础【对网络的认识】 &#xff08;一&#xff09;网络发展&#xff08;二&#xff09;协议1、协议是什么&#xff1f;2、协议分层3、OSI七层模型4、TCP/IP五层(或四层)模型5、系统与网络的关系6、总结 &#xff08;三&#xff09;网络传输流程1、网络传输…...

Kotlin 极简小抄 P8(不可空类型、可空类型、注意事项、非空断言 !!)

Kotlin 概述 Kotlin 由 JetBrains 开发&#xff0c;是一种在 JVM&#xff08;Java 虚拟机&#xff09;上运行的静态类型编程语言 Kotlin 旨在提高开发者的编码效率和安全性&#xff0c;同时保持与 Java 的高度互操作性 Kotlin 是 Android 应用开发的首选语言&#xff0c;也可…...

几种超声波芯片的特点和对比

一 CX20106A ZIP - 8 CX20106A ZIP - 8 的核心竞争力在于高性价比、易用性和抗光干扰能力&#xff0c;尤其适合消费电子、短距离工业检测和低成本物联网场景。尽管在距离和精度上不及高端芯片&#xff0c;但其成熟的电路方案和广泛的市场应用&#xff08;如经典红外遥控升级为超…...

软考 系统架构设计师系列知识点之杂项集萃(66)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之杂项集萃&#xff08;65&#xff09; 第106题 一般说来&#xff0c;SoC称为系统级芯片&#xff0c;也称片上系统&#xff0c;它是一个有专用目标的集成电路产品。以下关于SoC不正确的说法是&#xff08;&#xff09;。…...

Linux云计算训练营笔记day13[CentOS 7 find、vim、vimdiff、ping、wget、curl、RPM、YUM]]

Linux云计算训练营笔记day13[CentOS 7 find、vim、vimdiff、ping、wget、curl、RPM、YUM]] 目录 Linux云计算训练营笔记day13[CentOS 7 find、vim、vimdiff、ping、wget、curl、RPM、YUM]]1.find练习2.vim高级使用2.1 命令模式:2.2 插入模式:2.3 末行模式: 3. vimdiff4. ping5.…...

年会招标抽奖活动软件———仙盟创梦IDE

年会是企业一年的总结与欢庆时刻&#xff0c;而抽奖环节更是点燃全场气氛的关键。如何让抽奖环节既大气又充满仪式感&#xff1f;选对抽奖软件至关重要&#xff01;本文精心挑选了 3 款兼具实用性与氛围感的年会抽奖软件&#xff0c;从界面设计到功能特色&#xff0c;全方位为你…...

智防火灾,慧控能耗:物联网赋能金融行业电气安全革新

摘要 随着金融行业对电气安全需求的不断提升&#xff0c;传统用电管理模式已难以满足现代金融机构对火灾防控、能耗管理和智能运维的要求。本文基于物联网、云计算及大数据分析技术&#xff0c;提出一套针对金融行业的安全用电解决方案。该方案通过智能化硬件部署与平台化管理…...

UML基本概念:构造块、公共机制与规则

本篇来介绍UML的一些基础概念。 1 UML的结构 2 构造块 UML构造块是构成UML模型的基础元素&#xff0c;它们共同构成了UML的核心。 UML 的三种基本构造块是&#xff1a; 事物&#xff1a;对模型中重要元素的抽象&#xff0c;如类、对象等等关系&#xff1a;用来连接事物的&a…...

JAVA项目中常见的注解总结

以下是 Spring Boot/Spring MVC 项目中按使用频率排序的核心注解总结&#xff0c;包含常用场景和示例&#xff0c;帮助你快速掌握高频开发需求&#xff1a; 一、高频基础注解&#xff08;框架核心&#xff09; 1. SpringBootApplication&#xff08;启动类注解&#xff09; …...

数字电子技术基础(六十二)——使用Multisim软件绘制边沿触发的D触发器和JK触发器

1 使用Mulitism软件模拟时钟触发的D触发器 D触发器是一种基本的数字电路存储元件&#xff0c;它在时钟信号的边沿将输入数据D传递到输出Q。下面开始使用Multisim软件来模拟时钟触发的D触发器。 器件选择&#xff1a; 触发器选择&#xff1a;在组选项栏中点击Misc Digital&am…...

滚珠丝杆的承载力是多少?

滚珠丝杆的承载力不是一个固定值&#xff0c;它受到多种因素的影响&#xff0c;包括直径、螺距、滚珠个数、滚珠直径、材料、润滑条件等。 ‌滚珠丝杆的承载力主要取决于其额定动负荷和静负荷&#xff0c;额定动负荷是指在特定条件下&#xff0c;滚珠丝杆能够承受的动态负载&am…...

CQF预备知识:一、微积分简介 —— 基本术语详解

文中内容仅限技术学习与代码实践参考&#xff0c;市场存在不确定性&#xff0c;技术分析需谨慎验证&#xff0c;不构成任何投资建议。 &#x1f4d6; 数学入门全解 本教程为复习课程&#xff0c;旨在帮助读者复习数学知识。教程涵盖以下四个主题&#xff1a; 微积分线性代数微…...

【深度估计 Depth Estimation】数据集介绍

文章目录 总览1. KITTI Depth Completion1.1. 来源1.2. 采集场景1.3. 数据集内容1.4. 标注内容1.5. 任务目标1.6. 样本量1.7. 下载链接 2. KITTI Stereo Evaluation 20152.1. 来源2.2. 采集场景2.3. 数据集内容2.4. 标注内容2.5. 任务目标2.6. 样本量2.7. 下载链接 3. Virtual …...

鸿蒙UI开发——Builder与LocalBuilder对比

1、概 述 在ArkUI中&#xff0c;有的朋友应该接触过Builder和LocalBuilder。其中有了LocalBuilder的存在&#xff0c;是为了解决组件的父子关系和状态管理的父子关系保持一致的问题。 这里面最直观的表现则是this的指向问题与组件刷新问题&#xff0c;本文对Builder与LocalBu…...

FFT加窗和抽取滤波

FFT加窗 在信号处理中&#xff0c;为了减少频谱泄漏&#xff08;Spectral Leakage&#xff09;&#xff0c;在进行快速傅里叶变换&#xff08;FFT&#xff09;时通常会采用加窗&#xff08;Windowing&#xff09;技术。包括常见的窗函数及其特性对比。 MATLAB FFT 加窗流程 采…...

CentOS 10:启动telnet服务

参考&#xff0c; 鳥哥私房菜 - 第七章、網路安全與主機基本防護&#xff1a;限制埠口, 網路升級與 SELinux 7.3.3 埠口与服务的启动/关闭及开机时状态设定 我们知道系统的 Telnet 服务通常是以 super daemon 来控管的&#xff0c;请您启动您系统的 telnet 试看看。 1 要启动 …...

腾讯位置服务重构出行行业的技术底层逻辑

位置智能&#xff1a;重构出行行业的技术底层逻辑 在智慧城市建设与交通出行需求爆发的双重驱动下&#xff0c;位置服务正从工具层跃升为出行行业的核心基础设施。腾讯位置服务以“连接物理世界与数字空间”为核心理念&#xff0c;通过构建高精度定位、实时数据融合、智能决策…...

webpack5所用依赖以及对应的版本

所有依赖以及版本 {"name": "market-web","version": "0.1.0","private": true,"scripts": {"dev": "cross-env NODE_ENVdevelopment webpack serve --config ./vue.config.js","buil…...

vue-cli 构建打包优化(JeecgBoot-Vue2 配置优化篇)

项目&#xff1a;jeecgboot-Vue2 在项目二次开发后&#xff0c;在本人电脑打包时间为3分35秒左右 webpack5默认优化&#xff1a; Tree Shaking&#xff08;摇树优化&#xff09;&#xff1a;删除未使用的代码base64 内联&#xff1a; 小于 8KB 的资源&#xff08;图片等&…...

Webpack 分包策略详解及实现

Webpack 的分包策略&#xff08;Code Splitting&#xff09;是优化前端应用性能的重要手段&#xff0c;它能将代码拆分成多个 bundle&#xff0c;实现按需加载或并行加载&#xff0c;从而减少初始加载时间。 分包策略的必要性 在大型项目中&#xff0c;如果将所有代码打包到一…...

大模型微调与高效训练

随着预训练大模型&#xff08;如BERT、GPT、ViT、LLaMA、CLIP等&#xff09;的崛起&#xff0c;人工智能进入了一个新的范式&#xff1a;预训练-微调&#xff08;Pre-train, Fine-tune&#xff09;。这些大模型在海量数据上学习到了通用的、强大的表示能力和世界知识。然而&…...

postgreSQL日常维护

目录 登录数据库 数据库操作列出列出库 创建库 删除库 切换库 查看库的大小 数据表操作 列出表 创建表 复制表 删除表 查看表的结构 模式操作命令 创建模式 默认模式 删除模式 查看所有模式 在指定模式中创建表 切换当前模式 查看当前所在schema 查看搜索…...

数据直观分析与可视化

数据直观分析与可视化 一、数据的直观分析核心价值 数据的直观分析旨在通过视觉化的方式&#xff0c;帮助人们更直观、更快速地理解数据的特征和模式&#xff0c;从而发现趋势、异常值、分布情况以及变量之间的关系&#xff0c;为决策提供支持。 数据可视化与信息图形、信息可…...

BeamDojo: Learning Agile Humanoid Locomotion on Sparse Footholds

BeamDojo: Learning Agile Humanoid Locomotion on Sparse Footholds 研究动机解决方案技术路线踏脚点奖励双Critic进行稀疏奖励学习两阶段学习地形感知运动马尔可夫决策空间Sim2Real 附录实验结果 BeamDojo: Learning Agile Humanoid Locomotion on Sparse Footholds 研究动机…...

Spark大数据分与实践笔记(第五章 HBase分布式数据库-02)

文章目录 每日一句正能量第五章 HBase分布式数据库章节概要5.2 HBase的集群部署 每日一句正能量 人有三样东西是无法隐瞒的&#xff0c;咳嗽&#xff0c;穷困和爱&#xff0c;你想隐瞒越欲盖弥彰。人有三样东西是不该挥霍的&#xff0c;身体&#xff0c;金钱和爱&#xff0c;你…...

【面经分享】微派网络一面

HashMap 如何解决 哈希冲突&#xff1f; HashMap 是拉链法解决。 发生哈希冲突时&#xff0c;同一个槽位上&#xff0c;会形成一个链表。 一个槽位上的节点达到树化的阈值后&#xff0c;会树化为红黑树。 拉链法&#xff1a;哈希冲突时&#xff0c;同一个哈希槽拉成一个链表…...

【寻找Linux的奥秘】第七章:虚拟地址空间

前言 本专题将基于Linux操作系统来带领大家学习操作系统方面的知识以及学习使用Linux操作系统。上一章我们简单认识了环境变量&#xff0c;本章将讲解操作系统中另一个重要的概念——程序地址空间。 1. 初步认识 之前在我们学习C语言和C时我们知道&#xff0c;在我们的程序中不…...

网络安全-等级保护(等保) 2-0 等级保护制度现行技术标准

################################################################################ 第二章&#xff1a;现行等保标准要求&#xff0c;通过表格方式详细拆分了等保的相关要求。 GB 17859-1999 计算机信息系统 安全保护等级划分准则【现行】 GB/T22240-2020 《信息安全技术…...

Linux:进程信号---信号的保存与处理

文章目录 1. 信号的保存1.1 信号的状态管理 2. 信号的处理2.1 用户态与内核态2.2 信号处理和捕捉的内核原理2.3 sigaction函数 3. 可重入函数4. Volatile5. SIGCHLD信号 序&#xff1a;在上一章中&#xff0c;我们对信号的概念及其识别的底层原理有了一定认识&#xff0c;也知道…...

【Linux】C语言模拟实现shell命令行(程序替换原理)

目录 一、自动化构建工具&#xff08;makefile&#xff09; 二、输出提示符 三、获取用户输入的数据 四、将用户输入的指令字符串进行分割&#xff1a; 五、执行用户输入的命令 六、发现cd命令用不了&#xff08;内建命令&#xff09; 原因在于&#xff1a; 七、处理内…...

WordPress Madara插件存在文件包含漏洞(CVE-2025-4524)

免责声明 本文档所述漏洞详情及复现方法仅限用于合法授权的安全研究和学术教育用途。任何个人或组织不得利用本文内容从事未经许可的渗透测试、网络攻击或其他违法行为。使用者应确保其行为符合相关法律法规,并取得目标系统的明确授权。 对于因不当使用本文信息而造成的任何直…...