QCollator支持英文按a-z、中文按拼音a-z排序,但多音字支持有bug,本貼著重處理多音字排序不準(zhǔn)的問(wèn)題。
#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;
}
});
}
測(cè)試
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QStringList strList{"任務(wù)","搞笑","長(zhǎng)度","012","022","112","gaoding","changdu","長(zhǎng)大"};
QHash<QString,QString> specialProcessingHash;
sortLocaleAwareStringList(strList,specialProcessingHash);
qDebug()<<"1. sorted strlist === "<< strList;
// 定義目標(biāo)特殊字符串,以及其對(duì)應(yīng)的“cháng”發(fā)音拼音(用于強(qiáng)制排序)
specialProcessingHash={{"長(zhǎng)度","常度"},{"長(zhǎng)寬比","常寬比"}};
sortLocaleAwareStringList(strList,specialProcessingHash);
qDebug()<<"2. sorted strlist === "<< strList;
}
結(jié)果
1. sorted strlist === ("012", "022", "112", "changdu", "gaoding", "搞笑", "任務(wù)", "長(zhǎng)大", "長(zhǎng)度")
2. sorted strlist === ("012", "022", "112", "changdu", "gaoding", "長(zhǎng)度", "搞笑", "任務(wù)", "長(zhǎng)大")
從結(jié)果可以看出,第一次打印出來(lái)的內(nèi)容,”長(zhǎng)度“應(yīng)該被理解為”長(zhǎng)度”,但被解釋為“zhang度”,因?yàn)椤伴L(zhǎng)”是多音字;
經(jīng)過(guò)特別處理后,第二次打印出來(lái)的內(nèi)容,排序正常了;