如何按文件名中的整数升序排序并输出对应文件名?
问题描述
我已经从文件名里提取出所有整数并按升序排好了序,但现在需要按照排序后的整数顺序输出对应的原文件名,而不是只输出整数。文件名格式不固定,比如有的是image 1.png,有的是ImAGE1.png,唯一的排序依据就是文件名里的整数。目前我能得到排序后的整数序列(比如1、2、3、4……),但不知道怎么对应回原文件名。
现有Qt代码如下:
void QtWidget::displayImages(string str) { ui.images->clear(); QListWidgetItem *item = new QListWidgetItem(); QDirIterator it(QStringLiteral("C:\\Users\\Visual Studio 2015\\Projects\\QtWidget\\pic"), QStringList() << "*.jpg", QDir::Files, QDirIterator::Subdirectories); QFileInfo files; faList.clear(); while (it.hasNext()) { QFileInfo file(it.next()); faList.append(file.fileName()); _fileNames.append(file.fileName()); } string a = " " + result.toStdString() + " " ; str = a; stringstream ss; /* Storing the whole string into string stream */ ss << str; /* Running loop till the end of the stream */ string temp; int found; while (!ss.eof()) { /* extracting word by word from stream */ ss >> temp; /* Checking the given word is integer or not */ if (stringstream(temp) >> found) _integer.push_back(found); /* To save from space at the end of string */ temp = ""; } for (int i = 0; i < _integer.size(); i++) { int integers = _integer[i]; sort(_integer.begin(), _integer.end()); } for (auto integer : _integer) { cout << "SORTED int:" << integer; } }
未排序的文件名示例:
Image1_pic.png Image10_pic.png Images11_pics.png ... Images300.png
(注:每个文件名里的整数都是唯一的)
排序后的整数示例:
1 2 3 4
解决方案
核心思路是把文件名和对应的整数绑定存储,利用Qt的QMap<int, QString>自动按键(整数)升序排序的特性,直接得到排序后的文件名列表,避免分开存储导致的对应问题。
修改后的代码如下:
void QtWidget::displayImages(string str) { ui.images->clear(); // 用QMap存储整数与对应文件名,自动按整数升序排序 QMap<int, QString> sortedFileMap; QDirIterator it(QStringLiteral("C:\\Users\\Visual Studio 2015\\Projects\\QtWidget\\pic"), QStringList() << "*.jpg", QDir::Files, QDirIterator::Subdirectories); while (it.hasNext()) { QFileInfo file(it.next()); QString fileName = file.fileName(); int targetNum = 0; QString numBuffer; // 遍历文件名字符,提取连续数字 for (QChar c : fileName) { if (c.isDigit()) { numBuffer += c; } else if (!numBuffer.isEmpty()) { // 遇到非数字且已提取到数字,转换为整数 targetNum = numBuffer.toInt(); break; } } // 处理文件名末尾是数字的情况 if (!numBuffer.isEmpty() && targetNum == 0) { targetNum = numBuffer.toInt(); } // 确保提取到有效整数后存入Map if (targetNum != 0) { sortedFileMap.insert(targetNum, fileName); } } // 输出排序后的文件名,同时可添加到UI控件 qDebug() << "按整数排序后的文件名:"; for (const QString& sortedFileName : sortedFileMap.values()) { qDebug() << sortedFileName; ui.images->addItem(sortedFileName); } }
关键修改说明
- 绑定存储:用
QMap<int, QString>替代原来分开的_fileNames和_integer集合,直接将每个文件名与提取到的整数关联,QMap会自动按整数键完成升序排序,省去手动排序的步骤。 - 整数提取逻辑优化:遍历文件名的每个字符,提取连续的数字序列并转换为整数,兼容各种格式的文件名(大小写混合、带空格、前后有额外字符等场景)。
- 直接输出排序结果:遍历QMap的
values()方法即可得到按整数升序排列的原文件名,既可以打印调试,也能直接添加到QListWidget等UI控件中。
如果你的文件名中存在多个整数,但只需要提取第一个整数作为排序依据,当前逻辑完全适用;题目说明每个文件名的整数唯一,因此无需处理键冲突问题。
内容的提问来源于stack exchange,提问作者Cassey
相关产品推荐
相关产品推荐

