V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
zhuzhuyule
V2EX  ›  问与答

汉字首字母排序,这个需求无厘头吗?

  •  
  •   zhuzhuyule · Dec 6, 2017 · 6369 views
    This topic created in 3069 days ago, the information mentioned may be changed or developed.

    如题项目中使用表格,有表格就有排序,中国人当然少不了中文了,问题来了,汉字排序的意义是什么?


    排序方案

    1. 汉字拼音首字母排序 此排序需要借助字典,这样每个汉字都参与排序的顺序,能够更精准快速的让阅读者定位到位置(个人观点)。

    2. 汉字本地化排序 我这里说的是用( Javascript 中,String.localeCompare() )去做的比较排序,感觉排序出来的内容是针对拼音的排序,往往前一两个汉字就决定了排序的顺序,感觉排序不够完美。

    3. 汉字谈什么排序 是的,我和同事去讨论排序问题,他说:汉字谈什么排序,有什么意义,让他按照 ASCII 码自己排序不就完了?


    额,作为一个程序猿,难道不应该站在用户到角度去考虑产品的易用性么?还是我去考虑这个排序问题确实没用?

    看看大家对表格中的汉字排序有啥看法,另外有没有对首字母排序的方案有一些优秀代码的推荐。


    34 replies    2021-03-07 15:29:27 +08:00
    sundev
        1
    sundev  
       Dec 6, 2017
    怎么可能没意义,如果数据多了,不排序找起来很不方便的。
    zhuzhuyule
        2
    zhuzhuyule  
    OP
       Dec 6, 2017
    那就死支持排序 +1 了?
    meszyouh
        3
    meszyouh  
       Dec 6, 2017
    有种变相地分类的感觉
    chztv
        4
    chztv  
       Dec 6, 2017
    排序肯定有意义,至于是按什么排,要从产品需求角度出发,比如有很多人名,也可以按姓氏笔划排序。
    cctv1005s927
        5
    cctv1005s927  
       Dec 6, 2017
    汉字排序感觉还是挺正常的需求啊,excel 不都可以做汉字排序吗?
    yksoft1
        6
    yksoft1  
       Dec 6, 2017
    GB2312 范围就好办,本身好像就是按最常见读音来排的。
    RqPS6rhmP3Nyn3Tm
        7
    RqPS6rhmP3Nyn3Tm  
       Dec 6, 2017
    怎么可能没有意义,当代汉语拼音是最常用的就不说了,古人用过的有笔画数排序、部首排序、千字文排序。用了这么久的说没意义就没意义
    zhuzhuyule
        8
    zhuzhuyule  
    OP
       Dec 6, 2017
    @meszyouh 什么意思?

    @chztv 这个是的,人名按照笔画排序没问题。不过从日常的用词来看都是拼音首字母排序最大众了。
    zhuzhuyule
        9
    zhuzhuyule  
    OP
       Dec 6, 2017
    @cctv1005s927 大软件肯定应该满足这个需求的。那就是产品中能加入中文排序就最好加入中文排序了。
    miaoer1
        10
    miaoer1  
       Dec 6, 2017 via Android
    粑粑让你排你就乖乖排,还叫粑粑自己按 ascii 排。找抽啊。
    zhuzhuyule
        11
    zhuzhuyule  
    OP
       Dec 6, 2017
    @yksoft1 难道是 方法三? 让他自己去排就可以了?
    zhuzhuyule
        12
    zhuzhuyule  
    OP
       Dec 6, 2017
    @BXIA 少量的 那也没问题,数据量大,还是拼音首字母查比较方便。
    zhuzhuyule
        13
    zhuzhuyule  
    OP
       Dec 6, 2017
    @miaoer1 那就是同意 方法一了?
    johnnie502
        14
    johnnie502  
       Dec 6, 2017
    估计没几个人看明白楼主的所谓按汉字首字母排序的说法,我的理解是

    例如:
    张三 ZS
    账本 ZB

    按照普通的排序方法的话,是第一个汉字在码表里面的位置,拍成
    张三 ZS
    账本 ZB

    如果按照首字母排序的话,则应该是
    账本 ZB
    张三 ZS

    实际上这种排序意义不大,多数人还是按照第一个字的读音来定位,所以我选择 3
    amaranthf
        15
    amaranthf  
       Dec 6, 2017
    那个,汉字没有 ASCII 码……
    geelaw
        16
    geelaw  
       Dec 6, 2017
    字典也有不同的排序啊,按照读音排序有多音字的问题,按照部首排序有多部首的问题。比较简单的是按照笔画排序。
    zhuzhuyule
        17
    zhuzhuyule  
    OP
       Dec 6, 2017
    @johnnie502

    那你在看看如下的汉字排序,不知道你的默认排序
    ASCII
    奇 22855
    所 25151
    期 26399
    沙 27801
    绮 32494
    锁 38145

    3,方法
    ['锁骨','绮绮' ,'沙滩','期望','期望','期望','期望','期望','期望','期望','期望','所以'].sort()
    ==》 ["所以", "期望",'期望','期望','期望','期望','期望','期望','期望', "沙滩", "绮绮", "锁骨"]
    ==》 ["SQ", "QW",'QW','QW','QW','QW','QW','QW','QW', "ST", "QQ", "SG"]
    (当类似 "期望" 这种字符比较多的时候,你还只的后面会有 'S' 开头的 汉字吗?)

    2,方法
    ['锁骨','绮绮' ,'沙滩','期望','期望','期望','期望','期望','期望','期望','期望','所以'].sort((a,b)=>{ return a.localeCompare(b,'zh')})
    ==》 ["期望",'期望','期望','期望','期望','期望','期望','期望', "绮绮", "沙滩", "所以", "锁骨"]
    ==》 [ "QW",'QW','QW','QW','QW','QW','QW','QW', "QQ", "ShaTan", "SuoYi", "SuoGu"]
    (注意到 上面的 ["沙滩", "所以", "锁骨"] 了吧, localeCompare 如果比较拼音相同,则会检验 ASCII 码,第二个值不去作比较了)

    1,方法
    ['锁骨','绮绮' ,'沙滩','期望','期望','期望','期望','期望','期望','期望','期望','所以'].首字母排序()
    ==》 ["期望",'期望','期望','期望','期望','期望','期望','期望', "绮绮", "锁骨", "沙滩", "所以"]
    ==》 [ "QW",'QW','QW','QW','QW','QW','QW','QW', "QQ", "SuoGu", "ShaTan", "SuoYi"]
    (按照首字母排序能够更快的找到你想要的东西)

    以上只是举个例子,ASCII 排序没有意义了吧.

    请赐教。
    zhuzhuyule
        18
    zhuzhuyule  
    OP
       Dec 6, 2017
    @amaranthf
    ????

    @geelaw 是的,所以,拼音比较需要优化。不过绝大多数场景够用了。笔画的换,人民还要去想想这个字的实体,再去考虑他肯能的位置。
    sosilver
        19
    sosilver  
       Dec 6, 2017 via Android
    联系人应用不就用这个吗
    xml123
        20
    xml123  
       Dec 6, 2017
    一般而言都是方法二吧,如果我没有理解错的话。毕竟相同汉字开头的词语放在一起更符合直觉吧,单纯的把每个字的拼音首字母取出来,实际上效果并不会好吧。
    NonClockworkChen
        21
    NonClockworkChen  
       Dec 6, 2017
    @sosilver 复议,电话本就是这样...
    zsx
        22
    zsx  
       Dec 6, 2017
    localCompare 可以看我这篇文章,有大坑: https://blog.zsxsoft.com/post/31
    chiu
        23
    chiu  
       Dec 6, 2017 via Android
    手机电话薄里不也排序了
    just1
        24
    just1  
       Dec 6, 2017 via Android
    gb2312 不应该是按照新华字典顺序也就是拼音顺序排的吗?这不就是首字母吗?
    KgM4gLtF0shViDH3
        25
    KgM4gLtF0shViDH3  
       Dec 6, 2017
    反正通讯录是肯定要排序的。
    zhuzhuyule
        26
    zhuzhuyule  
    OP
       Dec 6, 2017
    @sosilver
    @xml123
    @zsx
    @chiu
    @bestkayle
    我看我手机里的排序类似方法 2,但是他是全拼音排序的,第二个汉字也会排入进去的,比如,买入,卖出。
    方法一:卖出,买入,锁骨,所以
    方法二:买入,卖出,所以,锁骨
    方法三:买入,卖出,所以,锁骨
    电话本:买入,卖出,所以,锁骨


    @just1 你意思直接方法 3 就可以了?
    openbsd
        27
    openbsd  
       Dec 6, 2017
    数据量大重音多的话个人倾向方法一 +
    首字首拼 首字二拼 .....
    二字首拼 二字二拼.....
    三字首拼
    微软的做法(瘟 server 里中文用户名排序为例)应该还加入了声调
    双人名,首字首拼 首字二拼 ....末字乱序
    例如 顺序状态(三角形向上 )汪 王 吴
    多音字,以该字读音(自然读音 ?)在前的为准
    比如 曾 就排在 陈 前 但是在姓里貌似我认识的都念( zeng )
    Showfom
        28
    Showfom  
    PRO
       Dec 6, 2017
    多音字怎么办呢
    houbaron
        29
    houbaron  
       Dec 6, 2017 via Android
    转成 GBK 编码似乎可以汉语拼音序
    zhuzhuyule
        30
    zhuzhuyule  
    OP
       Dec 6, 2017
    @openbsd 对的,加入音调和全拼,会导致字典变大的,再加入声调,就更大了,所以个人还是觉得 多字首字母排序。
    zhuzhuyule
        31
    zhuzhuyule  
    OP
       Dec 6, 2017
    @Showfom 多音字都没有很好的办法解决,只能群举了。告诉排序函数,哪些多音字需要指定翻译。
    zhuzhuyule
        32
    zhuzhuyule  
    OP
       Dec 6, 2017
    @houbaron 这个场景太局限了,而且也不一定准吧。
    rick09
        33
    rick09  
       Dec 6, 2017
    拼音排序,还是直接存储全拼最好。
    张三 ZS ZHANGSHAN
    bmxbmx3
        34
    bmxbmx3  
       Mar 7, 2021
    我写的中文排序库 cn_sort 应该可以帮到你,放在 pypi 了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   899 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 78ms · UTC 23:23 · PVG 07:23 · LAX 16:23 · JFK 19:23
    ♥ Do have faith in what you're doing.