c++ - 带有数字问题的自然排序文件名 C++

标签 c++ qt sorting natural-sort

我有一个文本文件要排序,其中包含图像文件的路径:

/images/calibrationImageRightCamera4.jpg
/images/calibrationImageLeftCamera1.jpg
/images/calibrationImageRightCamera5.jpg
/images/calibrationImageLeftCamera2.jpg
/images/calibrationImageLeftCamera4.jpg
/images/calibrationImageRightCamera6.jpg
/images/calibrationImageLeftCamera3.jpg
/images/calibrationImageRightCamera3.jpg
/images/calibrationImageRightCamera2.jpg
/images/calibrationImageLeftCamera5.jpg
/images/calibrationImageRightCamera1.jpg
/images/calibrationImageLeftCamera7.jpg
/images/calibrationImageLeftCamera6.jpg
/images/calibrationImageRightCamera7.jpg

我使用这段代码对文件进行排序:

    QFile imageListFile;
QStringList sortedImageListFile;
QString filePath;

filePath= "C:/Users/Desktop/textstream/sorted.xml";
imageListFile.setFileName(filePath);

if (!imageListFile.open(QFile::ReadOnly))
{
  cout<<"Error opening file"<<endl;
}
else
{
  while(!imageListFile.atEnd())
  {
    sortedImageListFile.append(imageListFile.readLine());
  }
  imageListFile.close();
}

// Sort the image file
qSort(sortedImageListFile.begin(), sortedImageListFile.end(), naturalSortCallback);

QTextStream stream(&imageListFile);

// Save sorted image in the same file
if(imageListFile.open((QIODevice::ReadWrite | QIODevice::Truncate)))
{
  for(QStringList::Iterator it= sortedImageListFile.begin(); it!= sortedImageListFile.end(); ++it)
  {
    stream << *it;
  }
}
imageListFile.close();



inline int findNumberPart(const QString &sIn)
{
  QString s= "";
  int i= 0;
  bool isNum= false;

  while(i< sIn.length())
  {
    if(isNum)
    {
    if(!sIn[i].isNumber())
    break;
    s += sIn[i];
    }
    else
    {
    if(sIn[i].isNumber())
    s += sIn[i];
    }
  ++i;
  }

  if(s == "")

    return 0;
    return s.toInt();
}


static bool naturalSortCallback(const QString &s1, const QString &s2)
{
  int idx1= findNumberPart(s1);
  int idx2= findNumberPart(s2);

  return(idx1 < idx2);
}

结果是:

/cameraCalibrationFiles/calibrationImageLeftCamera1.jpg
/cameraCalibrationFiles/calibrationImageRightCamera1.jpg
/cameraCalibrationFiles/calibrationImageLeftCamera2.jpg
/cameraCalibrationFiles/calibrationImageRightCamera2.jpg
/cameraCalibrationFiles/calibrationImageLeftCamera3.jpg
/cameraCalibrationFiles/calibrationImageRightCamera3.jpg
/cameraCalibrationFiles/calibrationImageRightCamera4.jpg
/cameraCalibrationFiles/calibrationImageLeftCamera4.jpg
/cameraCalibrationFiles/calibrationImageLeftCamera5.jpg
/cameraCalibrationFiles/calibrationImageRightCamera5.jpg
/cameraCalibrationFiles/calibrationImageRightCamera6.jpg
/cameraCalibrationFiles/calibrationImageLeftCamera6.jpg
/cameraCalibrationFiles/calibrationImageLeftCamera7.jpg
/cameraCalibrationFiles/calibrationImageRightCamera7.jpg

和 处的数字排序正确,但文件名排序不正确。有时“左”和“右”这两个词混用。顺序应如下所示:

..LeftCamera1.jpg
..RightCamera1.jpg
..LeftCamera2.jpg
..RightCamera2.jpg
.
.
.

我的错误在哪里?感谢您的帮助。

最佳答案

你的问题是你比较字符串的方式。

inline int findNumberPart(const QString &sIn)

只是给你字符串的结尾数字。因此,任何以 1 结尾的字符串都将排在任何其他字符串之前。这就是左右摄像机文件名混合在一起并且没有特定顺序的原因。您需要做的是比较数字部分,如果相等则比较字符串部分。如果不是,则只比较数字部分。

关于c++ - 带有数字问题的自然排序文件名 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34343898/

相关文章:

asp.net-mvc - ASP.NET MVC : Custom Sorting

iphone - 如何使用比较:options对NSArray进行排序

c++ - 重载可变模板成员函数和可变模板函数

c++ - 如何避免由于遍历大量数据而导致应用程序死锁?

qt - 如何使用 QT 和 C++ 将字符串参数传递给函数

c++ - Qt 中的小数类型 (C++)

c++ - 为什么我的合并排序代码比插入排序慢

c++ - 输入端问题及图

c++ - 从 64 位迁移到 32 位

c++ - size_t(* B)[N]和size_t * B [N]之间的差异