请教按中英文首字母排序的 JAVA 实现方式

本贴最后更新于 1948 天前,其中的信息可能已经天翻地覆

目前的需求是需要做一个类似微信好友排序的实现,按中文拼音首字母、英文首字母排序,符号和数字排在最后面。

查了网上用 Compartor 实现,发现并不符合要求

public static void main(String[] args) {

        List<String> list = Lists.newArrayList();
        list.add("阿三");
        list.add("a-");
        list.add("张三");
        list.add("!asda");
        list.add("b");
        Comparator comparator = Collator.getInstance(Locale.CHINA);
        Collections.sort(list, comparator);
        for (String s : list) {
            System.out.println(s);
        }
    }

以下为执行结果
image.png

求教大家有什么改进或者更好的方法实现

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3187 引用 • 8213 回帖
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    8128 引用 • 37050 回帖 • 160 关注
1 操作
DrJoseph 在 2019-07-26 10:20:31 置顶了该帖

相关帖子

被采纳的回答
  • visus

    数字为 number1,字母为 number2,其他文字为 number3,每一个 number 里面又排序,完美解决你的问题

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 88250

    把汉字转拼音然后再一起排序吧。

    1 回复
  • visus

    牛逼

  • visus

    (๑′ᴗ‵๑)I L ᵒᵛᵉᵧₒᵤ ❤

  • visus

    自定义实现 Compator 呀,高仿 SDK 的 Compator

  • visus

    但是如果是其他文字,比如韩文,他们是怎么排序的

  • visus

    这个时候就需要 SDK 的 Compator 了

  • visus
     Comparator comparator = Collator.getInstance(Locale.CHINA);
                Comparator comparator1 = Collator.getInstance(Locale.KOREA);
    
  • visus

    发现一个 bug,你这样做,会有 bug,必须使用 com.ibm.icu.util.ULocale.SIMPLIFIED_CHINESE 才不会有隐形 bug

  • visus

    哦,你这个是混排序了,一般都是根据每一个 ULocale.CHINA 的依据才可以,因为韩语的排序的因子和中文的排序因子不一样

    1 回复
  • DrJoseph
    作者

    转拼音再排也只是把中英文的排序排对了,数字字符的排序还是会在前面,而我需要把数字字符排在最后

    1 回复
  • visus

    搞一个主排序因子和次排序因子

  • DrJoseph
    作者

    韩语貌似骚了一点吧,我先试试你这个

  • visus

    数字为 number1,字母为 number2,其他文字为 number3,每一个 number 里面又排序,完美解决你的问题

    1 回复
  • visus

    数字为 number1,字母为 number2,其他文字为 number3,每一个 number 里面又排序,完美解决你的问题

  • visus

    给积分

  • visus

    为啥我最近的积分,只有 3700 了,可怕

  • 88250

    你给他结贴吧,他说的方案应该 work。

  • DrJoseph
    作者

    是分成三个数组之后再排序吗,还有就是这个主排序因子和次排序因子怎么设置额

  • visus

    这个规则,如果自己有能力决定,要根据自己的业务的,如果以后没什么扩展或者,就是文字了,大体这样没啥问题

    1 回复
  • visus

    要看业务的,这个

  • DrJoseph
    作者

    还请麻烦解释一下这个 number1、number2、number3 是怎么定义的,然后是怎么进行排序的

  • visus

    还有特殊字符,可以转化为 ACLL 码,无敌

  • visus

    用 ACLL 码,排序,不用脑子想规则

  • visus

    我没有做过,你要看你的业务,需要哪些文字可以排到前面呀

  • visus

    比如我故意想让杀马特文字排序第一位,你要研究杀马特文字有啥特点,搞一个 number1 的规则出来

    2 回复
  • DrJoseph
    作者

    没有那么特殊的需求,只是区分中英文和其他,中英文按首字母排序,其他的一律排在最后。转 ASCII 排序的话数字和符号会排在字母之前,也不符合要求吧

  • DrJoseph
    作者

    还有就是我至今不明白你定义的这个 number1 是什么类型,Compartor 吗

  • visus

    等级来的,number1 表示等级最高,其次 number2,然后 number3,就是先分好类别

    1 回复
  • visus

    你可以有 n 个等级,每一个等级在排序,等级也可以排序

  • visus

    其实 JDK 里面的比对字母也是 ACLL 码,我猜的,90% 是

  • Archbishoplemon

    就像楼上说的设置好几个等级区分制度,之后再把这几个等级进行区分

  • DrJoseph
    作者

    还是不明白这个等级是什么类,是定义好几个不同的 compartor,然后调用 compartor.thenComparing(Comparator other)来定义等级优先吗

    1 回复
  • visus

    我想手把手说明一下,可惜没机会

    2 回复
  • DrJoseph
    作者

    你可以贴一下你的代码,伪代码即可

    1 回复
  • DrJoseph
    作者

    你说的这个等级是定义在 Bean 里的一个字段吗,如果是的话等级值如何插入,是需要遍历数组然后根据 ASCII 范围重新定义一个等级吗(如果首字母 ASCII < 65 且 ASCII > 122,设为二类等级,其他为一类等级),然后一二类等级各自根据 ASCII 码排序,然后把二类的排在一类后面

  • visus

    兄弟,我也要生活的呀

    1 回复
  • DrJoseph
    作者

    只是你总是没有回答我提出的疑问我也很苦恼啊,感觉我们没有在一个沟通点上 😂

  • 57845310

    我只是提供下微信的实现思路,为每个用户先生成拼音全拼和简拼,再进行排序

请输入回帖内容 ...

推荐标签 标签

  • DNSPod

    DNSPod 建立于 2006 年 3 月份,是一款免费智能 DNS 产品。 DNSPod 可以为同时有电信、网通、教育网服务器的网站提供智能的解析,让电信用户访问电信的服务器,网通的用户访问网通的服务器,教育网的用户访问教育网的服务器,达到互联互通的效果。

    6 引用 • 26 回帖 • 510 关注
  • 职场

    找到自己的位置,萌新烦恼少。

    127 引用 • 1705 回帖
  • 锤子科技

    锤子科技(Smartisan)成立于 2012 年 5 月,是一家制造移动互联网终端设备的公司,公司的使命是用完美主义的工匠精神,打造用户体验一流的数码消费类产品(智能手机为主),改善人们的生活质量。

    4 引用 • 31 回帖 • 2 关注
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    70 引用 • 193 回帖 • 431 关注
  • abitmean

    有点意思就行了

    30 关注
  • Hadoop

    Hadoop 是由 Apache 基金会所开发的一个分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

    86 引用 • 122 回帖 • 625 关注
  • 智能合约

    智能合约(Smart contract)是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于 1994 年由 Nick Szabo 首次提出。

    1 引用 • 11 回帖 • 4 关注
  • PWL

    组织简介

    用爱发电 (Programming With Love) 是一个以开源精神为核心的民间开源爱好者技术组织,“用爱发电”象征开源与贡献精神,加入组织,代表你将遵守组织的“个人开源爱好者”的各项条款。申请加入:用爱发电组织邀请帖
    用爱发电组织官网:https://programmingwithlove.stackoverflow.wiki/

    用爱发电组织的核心驱动力:

    • 遵守开源守则,体现开源&贡献精神:以分享为目的,拒绝非法牟利。
    • 自我保护:使用适当的 License 保护自己的原创作品。
    • 尊重他人:不以各种理由、各种漏洞进行未经允许的抄袭、散播、洩露;以礼相待,尊重所有对社区做出贡献的开发者;通过他人的分享习得知识,要留下足迹,表示感谢。
    • 热爱编程、热爱学习:加入组织,热爱编程是首当其要的。我们欢迎热爱讨论、分享、提问的朋友,也同样欢迎默默成就的朋友。
    • 倾听:正确并恳切对待、处理问题与建议,及时修复开源项目的 Bug ,及时与反馈者沟通。不抬杠、不无视、不辱骂。
    • 平视:不诋毁、轻视、嘲讽其他开发者,主动提出建议、施以帮助,以和谐为本。只要他人肯努力,你也可能会被昔日小看的人所超越,所以请保持谦虚。
    • 乐观且活跃:你的努力决定了你的高度。不要放弃,多年后回头俯瞰,才会发现自己已经成就往日所仰望的水平。积极地将项目开源,帮助他人学习、改进,自己也会获得相应的提升、成就与成就感。
    1 引用 • 487 回帖
  • 大数据

    大数据(big data)是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

    93 引用 • 113 回帖
  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    83 引用 • 37 回帖
  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖
  • 酷鸟浏览器

    安全 · 稳定 · 快速
    为跨境从业人员提供专业的跨境浏览器

    3 引用 • 59 回帖 • 26 关注
  • 代码片段

    代码片段分为 CSS 与 JS 两种代码,添加在 [设置 - 外观 - 代码片段] 中,这些代码会在思源笔记加载时自动执行,用于改善笔记的样式或功能。

    用户在该标签下分享代码片段时需在帖子标题前添加 [css] [js] 用于区分代码片段类型。

    70 引用 • 375 回帖 • 1 关注
  • danl
    132 关注
  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖
  • Log4j

    Log4j 是 Apache 开源的一款使用广泛的 Java 日志组件。

    20 引用 • 18 回帖 • 29 关注
  • H2

    H2 是一个开源的嵌入式数据库引擎,采用 Java 语言编写,不受平台的限制,同时 H2 提供了一个十分方便的 web 控制台用于操作和管理数据库内容。H2 还提供兼容模式,可以兼容一些主流的数据库,因此采用 H2 作为开发期的数据库非常方便。

    11 引用 • 54 回帖 • 653 关注
  • webpack

    webpack 是一个用于前端开发的模块加载器和打包工具,它能把各种资源,例如 JS、CSS(less/sass)、图片等都作为模块来使用和处理。

    41 引用 • 130 回帖 • 260 关注
  • WebComponents

    Web Components 是 W3C 定义的标准,它给了前端开发者扩展浏览器标签的能力,可以方便地定制可复用组件,更好的进行模块化开发,解放了前端开发者的生产力。

    1 引用
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 374 关注
  • 知乎

    知乎是网络问答社区,连接各行各业的用户。用户分享着彼此的知识、经验和见解,为中文互联网源源不断地提供多种多样的信息。

    10 引用 • 66 回帖
  • 996
    13 引用 • 200 回帖 • 6 关注
  • App

    App(应用程序,Application 的缩写)一般指手机软件。

    91 引用 • 384 回帖 • 1 关注
  • Notion

    Notion - The all-in-one workspace for your notes, tasks, wikis, and databases.

    6 引用 • 38 回帖
  • Windows

    Microsoft Windows 是美国微软公司研发的一套操作系统,它问世于 1985 年,起初仅仅是 Microsoft-DOS 模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家户户人们最喜爱的操作系统。

    222 引用 • 473 回帖
  • 人工智能

    人工智能(Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。

    133 引用 • 189 回帖
  • Ngui

    Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
    Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。

    7 引用 • 9 回帖 • 391 关注