强化QCollator排序【特殊处理多音字】

QCollator支持英文按a-z、中文按拼音a-z排序,但多音字支持有bug,本贴着重处理多音字排序不准的问题。

#include <QCollator>
#include <QDebug>

void sortLocaleAwareStringList(QStringList& strList, QHash<QString,QString> &specialProcessingHash) {
    QLocale chineseLocale(QLocale::Chinese, QLocale::China);
    QCollator collator(chineseLocale);
    collator.setCaseSensitivity(Qt::CaseInsensitive);
    collator.setNumericMode(true);

    std::sort(strList.begin(), strList.end(), [&collator,specialProcessingHash](const QString& a, const QString& b) {

        if(!specialProcessingHash.empty()){
            QString str1 = specialProcessingHash.contains(a) ? specialProcessingHash[a] : a;
            QString str2 = specialProcessingHash.contains(b) ? specialProcessingHash[b] : b;
            return collator.compare(str1, str2) < 0;
        }else{
            return collator.compare(a, b) < 0;
        }
    });
}

测试

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QStringList strList{"任务","搞笑","长度","012","022","112","gaoding","changdu","长大"};
    QHash<QString,QString> specialProcessingHash;
    sortLocaleAwareStringList(strList,specialProcessingHash);
    qDebug()<<"1. sorted strlist  === "<< strList;


    // 定义目标特殊字符串,以及其对应的“cháng”发音拼音(用于强制排序)
    specialProcessingHash={{"长度","常度"},{"长宽比","常宽比"}};

    sortLocaleAwareStringList(strList,specialProcessingHash);
    qDebug()<<"2. sorted strlist  === "<< strList;

}

结果

1. sorted strlist  ===  ("012", "022", "112", "changdu", "gaoding", "搞笑", "任务", "长大", "长度")
2. sorted strlist  ===  ("012", "022", "112", "changdu", "gaoding", "长度", "搞笑", "任务", "长大")

从结果可以看出,第一次打印出来的内容,”长度“应该被理解为”长度”,但被解释为“zhang度”,因为“长”是多音字;
经过特别处理后,第二次打印出来的内容,排序正常了;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容