汉字首字母排序,这个需求无厘头吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zhuzhuyule
V2EX    问与答

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

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

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


    排序方案

    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
    范围就好办,本身好像就是按最常见读音来排的。
    RqPS6rhmP3Nyn3Tm /td>
        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
    不应该是按照新华字典顺序也就是拼音顺序排的吗?这不就是首字母吗?
    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  
    PRO
       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     Solana     5515 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 37ms UTC 01:22 PVG 09:22 LAX 18:22 JFK 21:22
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86