使用QCollator根据文件名排序

升序

要在Qt C++中按照你期望的顺序对文件名进行排序,你可以实现一个自定义的比较函数。这个比较函数需要处理字母和数字的混合情况,使排序结果符合你描述的需求。下面是一个示例代码,展示如何实现这个排序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <QCoreApplication>
#include <QString>
#include <QVector>
#include <QDebug>
#include <QCollator>

// 自定义比较函数
bool customCompare(const QString &s1, const QString &s2) {
QCollator collator;
collator.setNumericMode(true);
return collator.compare(s1, s2) < 0;
}

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

// 文件名列表
QVector<QString> fileNames = {
"藏海花.txt", "2海花.txt", "b海花1.txt", "b海花.txt", "a海花3.txt",
"a海花1.txt", "a海花2.txt", "藏海花1.txt", "藏海花7.txt", "藏海花12.txt",
"藏海花3.txt", "大海花.txt", "藏海花9.txt", "b海花2.txt", "1海花.txt",
"藏海花10.txt", "藏海花5.txt", "a海花.txt", "b海花3.txt", "藏海花8.txt",
"藏海花6.txt", "a海花.txt", "藏海花4.txt", "藏海花2.txt", "藏海花11.txt",
"藏海花.txt"
};

// 排序
std::sort(fileNames.begin(), fileNames.end(), customCompare);

// 打印排序后的结果
for (const QString &name : fileNames) {
qDebug() << name;
}

return a.exec();
}

在这个例子中,我们使用了 QCollator 进行数字模式的比较,这样可以处理混合的字母和数字。customCompare 函数保证了数字在排序时会按照其数值大小进行排序,而不是作为普通的字符进行比较。

如果你希望对更复杂的规则进行排序,你可能需要实现更加复杂的比较逻辑。不过,QCollator 的数字模式应该能够满足你的大部分需求。

降序

要在Qt C++中按照你期望的顺序对文件名进行排序,你可以实现一个自定义的比较函数。这个比较函数需要处理字母和数字的混合情况,使排序结果符合你描述的需求。下面是一个示例代码,展示如何实现这个排序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <QCoreApplication>
#include <QString>
#include <QVector>
#include <QDebug>
#include <QCollator>

// 自定义比较函数
bool customCompare(const QString &s1, const QString &s2) {
QCollator collator;
collator.setNumericMode(true);
return collator.compare(s1, s2) > 0;
}

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

// 文件名列表
QVector<QString> fileNames = {
"藏海花.txt", "2海花.txt", "b海花1.txt", "b海花.txt", "a海花3.txt",
"a海花1.txt", "a海花2.txt", "藏海花1.txt", "藏海花7.txt", "藏海花12.txt",
"藏海花3.txt", "大海花.txt", "藏海花9.txt", "b海花2.txt", "1海花.txt",
"藏海花10.txt", "藏海花5.txt", "a海花.txt", "b海花3.txt", "藏海花8.txt",
"藏海花6.txt", "a海花.txt", "藏海花4.txt", "藏海花2.txt", "藏海花11.txt",
"藏海花.txt"
};

// 排序
std::sort(fileNames.begin(), fileNames.end(), customCompare);

// 打印排序后的结果
for (const QString &name : fileNames) {
qDebug() << name;
}

return a.exec();
}

在这个例子中,我们使用了 QCollator 进行数字模式的比较,这样可以处理混合的字母和数字。customCompare 函数保证了数字在排序时会按照其数值大小进行排序,而不是作为普通的字符进行比较。

如果你希望对更复杂的规则进行排序,你可能需要实现更加复杂的比较逻辑。不过,QCollator 的数字模式应该能够满足你的大部分需求。

QCollator

QCollator 是 Qt 框架中的一个类,用于根据用户的区域设置,以语言学上正确的方式比较字符串。它特别适合处理需要按照本地规则进行排序的场景,比如处理带有重音符号的字符、大小写敏感度以及自然排序等。

QCollator 的主要特性:

  • 支持区域设置:根据用户的区域设置进行字符串比较,适合多语言应用。
  • 大小写敏感性:可以设置为区分或不区分大小写进行比较。
  • 重音符号处理:可以配置为考虑或忽略重音符号。
  • 自然排序:能够正确处理字符串中的数字部分,例如确保 “file10” 排在 “file2” 之后。
  • 线程安全:多个 QCollator 实例可以在不同的线程中使用,每个线程使用自己的实例即可。

基本使用方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <QCollator>
#include <QString>
#include <QList>
#include <QDebug>

int main() {
QList<QString> list;
list << "苹果" << "香蕉" << "葡萄" << "苹果" << "橘子" << "梨";

QCollator collator;
collator.setLocale(QLocale::Chinese); // 设置为中文区域
collator.setCaseSensitivity(Qt::CaseInsensitive); // 大小写不敏感
collator.setIgnorePunctuation(true); // 如果需要,可以忽略标点符号

std::sort(list.begin(), list.end(), collator); // 使用 QCollator 进行排序

for (const QString &str : list)
qDebug() << str;
}

重要方法:

  • setLocale(const QLocale &locale):设置字符串排序的区域。
  • setCaseSensitivity(Qt::CaseSensitivity):设置是否区分大小写。
  • setNumericMode(bool):启用或禁用自然数字排序。
  • setIgnorePunctuation(bool):指定是否忽略标点符号。

适用于中文的场景:

在中文环境中,QCollator 可以根据拼音顺序或区域设置规则进行字符串排序。例如,上述例子会将 “苹果” 和 “香蕉” 按照拼音顺序排序,确保正确的语言排序规则。

通过使用 QCollator,可以方便地对中文字符串进行符合语言习惯的排序处理,非常适合在多语言或需要本地化的应用程序中使用。

-------------本文结束感谢您的阅读-------------