Q中字符排序以及转化问题

423 阅读3分钟

「这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战

最近用到了字符串的排序问题,主要功能包括:

1:中文字符串排序

2:英文字符串排序

3:数字排序

4:字符串字母转换

那么,接下来我会详细的介绍以上这些功能哦~

1:中文字符串排序

中国汉字博大精深,我们在排序的时候最难得也是中文字符串的排序了。不过,在Qt中提供了一个非常方便的类,解决了排序难的问题:QLocale类

QLocale类用各种语言在数字和它们的字符串表示之间进行转换。QLocale在其构造函数中使用语言/国家对进行初始化,并提供类似于QString中的数字到字符串和字符串到数字的转换函数。

针对以上类的使用,我们来解决如何对中文字符串排序吧!

  • 中文字符串正排序
QLocale loc(QLocale::Chinese, QLocale::China);

构造QLocale类,并且指定使用中文格式转换形式

 loc.languageToString(QLocale::Chinese);

返回一个包含语言名称的QString字符串,获取到转换后的信息之后,将字符串信息新型排序

QCollator qoc(loc);
qSort(listData.begin(), listData.end(), qoc); //正序排序
  • 中文字符串倒排序

与正排序有些类似,只是在qSort时稍微有些变化,其他都是一致的,这里就不详细介绍了哟~

2:英文字符串排序

该功能我们继续沿用第一个功能的类:QLocale

实现起来写法比较相似,只是将Chinese 转换成English

QLocale loc(QLocale::English);

构造英文类型的QLocale类信息

loc.languageToString(QLocale::English);

返回一个包含语言名称的QString字符串,获取到转换后的信息之后,将字符串信息新型排序

QCollator qoc(loc);
qSort(listData.begin(), listData.end(), qoc); //正序排序

3:数字排序

与上述两个功能相比较而言,还是比较简单的,这里我们用vector来存储需要排序的数据。

对于这种只存储一个值的容器来说,排序只需要使用sort就可以了。

但是,需要注意的一点是:set容器,使用这个容器的时候还需要自己重载比较运算符,所以,我们一般情况下会使用Vector这种顺序存储的容器

假设,存储数据的容器定义为:std::vector vetData

对整型数据正排序

sort(vetData.begin(), vetData.end());

对整型数据倒排序

sort(vetData.rbegin(), vetData.rend());

4:字符串字母转换

对于CString的字符串来说,直接一个API就可以搞定了,那么我们要是自己转换呢?

虽然功能比较基类,就当自己学习了!

我们知道ASCII码中,大写字母与小写字母的值是不一致的。那么,当我们遇到小写字母的值之后,直接替换成大写字母的ASCII值,就可以实现字符串的转换了!

for (int i=0; i< sText.length(); i++)
{
	if (sText[i] >= 'A' && sText[i] <= 'Z')
	{
		sText[i] += 32;
		continue;
	}
}
return sText;

今天的功能比较简单,就更新到这里喽~