目前的需求是需要做一个类似微信好友排序的实现,按中文拼音首字母、英文首字母排序,符号和数字排在最后面。 查了网上用 Compartor 实现,发现并不符合要求 public static void main(String[] args) { List list = Lists.newArrayList(); list. ..

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

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

查了网上用 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 技术具有卓越的通用性、高效性、平台移植性和安全性。

    2361 引用 • 7825 回帖 • 890 关注
  • Q&A

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

    1256 引用 • 8197 回帖 • 576 关注
1 操作
DrJoseph 在 2019-07-26 10:20:31 置顶了该帖
被采纳的回答
  • kafuly

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

38 回帖
请输入回帖内容...
  • 88250

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

    1 回复
  • kafuly

    牛逼

  • kafuly

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

  • kafuly

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

  • kafuly

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

  • kafuly

    这个时候就需要 SDK 的 Compator 了

  • kafuly

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

  • kafuly

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

  • kafuly

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

    1 回复
  • DrJoseph

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

    1 回复
  • kafuly

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

  • DrJoseph

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

  • kafuly

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

    1 回复
  • kafuly

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

  • kafuly

    给积分

  • kafuly

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

  • 88250

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

  • DrJoseph

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

  • kafuly

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

    1 回复
  • kafuly

    要看业务的,这个

  • DrJoseph

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

  • kafuly

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

  • kafuly

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

  • kafuly

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

  • kafuly

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

    2 回复
  • DrJoseph

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

  • DrJoseph

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

  • kafuly

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

    1 回复
  • kafuly

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

  • kafuly

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

  • Archbishoplemon

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

  • DrJoseph

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

    1 回复
  • kafuly

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

    2 回复
  • DrJoseph

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

    1 回复
  • DrJoseph

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

  • kafuly

    兄弟,我也要生活的呀

    1 回复
  • DrJoseph

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

  • 57845310

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

请输入回帖内容 ...