You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按文件名中的整数升序排序并输出对应文件名?

问题描述

我已经从文件名里提取出所有整数并按升序排好了序,但现在需要按照排序后的整数顺序输出对应的原文件名,而不是只输出整数。文件名格式不固定,比如有的是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 11:23:11