V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
zhuzhuyule
V2EX  ›  问与答

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

  •  
  •   zhuzhuyule · 2017-12-06 09:14:41 +08:00 · 5231 次点击
    这是一个创建于 2577 天前的主题,其中的信息可能已经有所发展或是发生改变。

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


    排序方案

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

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

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


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

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


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

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

    例如:
    张三 ZS
    账本 ZB

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

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

    实际上这种排序意义不大,多数人还是按照第一个字的读音来定位,所以我选择 3
    amaranthf
        15
    amaranthf  
       2017-12-06 10:24:04 +08:00
    那个,汉字没有 ASCII 码……
    geelaw
        16
    geelaw  
       2017-12-06 10:44:55 +08:00
    字典也有不同的排序啊,按照读音排序有多音字的问题,按照部首排序有多部首的问题。比较简单的是按照笔画排序。
    zhuzhuyule
        17
    zhuzhuyule  
    OP
       2017-12-06 11:04:10 +08:00
    @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
       2017-12-06 11:06:34 +08:00
    @amaranthf
    ????

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


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