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度”,因为“长”是多音字;
经过特别处理后,第二次打印出来的内容,排序正常了;