需求
对ui显示的表格进行排序,需支持中文字母排序,但是sqlite数据库不支持中文的拼音和笔画排序,这样就会导致排序中文显示顺序无规律。这个时候,就需要自己写一个排序功能,且排序支持中文拼音排序。
示例
有一个字符串链表,有n个字符串,需要对这些字符串进行排序(支持中文拼音排序)。
代码定义如下:
QStringList list;
list<< "1中中句"
<< "方法"
<< "2中句中"
<< "种"
<< "句外"
<< "中中"
<< "句章 "
<< "a强蛟厂"
<< "b甜甜"
<< "章章"
<< "1方法"
<< "rgerag"
<< "efw"
<< "eed"
<< "easw"
<< "我的杀杀杀 "
<< "跳跳框框"
<< "条条奔奔"
<< "希望小学"
<< "小桃"
<< "小涛"
<< "张麻子"
<< "张强"
<< "小李飞刀"
<< "小李他娘"
<< "12五"
<< "874ff的"
<< "哈哈哈,很强";
排序方法
比较函数:
//比较策略
bool LessThan(const QString &s1, const QString &s2)
{
return (s1.localeAwareCompare(s2) < 0);
}
标准库中排序函数sort的使用:
std::sort(sList.begin(), sList.end(), LessThan); //迭代器 + 函数指针
现象
由于代码比较简单,这里就不做demo了,展示排序结果:
排序结果为:
(“12五”, “1方法”, “1中中句”, “2中句中”, “874ff的”, “a强蛟厂”, “b甜甜”, “easw”, “eed”, “efw”, “rgerag”, “方法”, “哈哈哈,很强”, “句外”, "句章 ", “条条奔奔”, “跳跳框框”, "我的杀杀杀 ", “希望小学”, “小李飞刀”, “小李他娘”, “小涛”, “小桃”, “张麻子”, “张强”, “章章”, “中中”, “种”)
显然排序顺序依次为英文符号、数字、字母、中文符号、中文(拼音)。
如果需要倒序,则将比较函数修改即可:
//比较策略
bool LessThan(const QString &s1, const QString &s2)
{
return (s1.localeAwareCompare(s2) > 0);
}
又或者使用rbegin、rend函数进行倒序排序,这样的操作没有试过。