QString :: startWith()& QStringList :: removeAll()的行为不符合预期

时间:2011-09-07 13:44:52

标签: c++ qt

我有两个清单。两者都包含相同的值:

 QStringList filePaths;
 filePaths.append("C:/backup");
 filePaths.append("C:/download/file1");
 filePaths.append("D:");
 filePaths.append("C:/program");
 filePaths.append("C:/download");

 QStringList refinedPaths;

 int size = filePaths.size();

 for(int i = 0; i < size; i++)
 {
   refinedPaths.append(filePaths.at(i));
 }

 for(int i = 0; i < size; i++)
 {
   QString str1 = filePaths.at(i);

   for(int j = 0; j < size; j++)
   {
     QString str2 = filePaths.at(j);

     if(str2 == str1)
     {
       continue;
     }

     if(str2.startsWith(str1))
     {
       refinedPaths.removeAll(str2);
     }
   }
 }

我期待发生的事情是:  *遍历列表中的字符串,将列表中的每个项目相互比较。  *如果string1以string2开头(string2因此是string1的父目录)  *从'精炼'字符串列表中删除该字符串。

然而,发生的事情是if(str2.startsWith(str1))每次都返回true,refinedPaths.removeAll(str2);不会删除列表中的任何字符串。

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

下面的代码段根据需要合理化列表。

   foreach (const QString& path, filePaths)
   {
      foreach (const QString& other, filePaths)
      {
         if (other != path && other.startsWith(path))
            filePaths.removeOne (other);
      }
   }

答案 1 :(得分:1)

您的代码运行正常,不确定您指的是什么问题。在这里使用你的代码是我得到的输出

C:/backup
D:
C:/program
C:/download

要改进的一些事项,

  1. 而不是逐个元素地复制QStringList,你可以使用复制构造函数,即从filePaths复制到refinePaths QStringList refinedPaths(filePaths);

  2. 使用迭代器而不是按size()迭代。

    QStringList refinedPaths(filePaths);
    
    for(QStringList::const_iterator itr1 = filePaths.begin(); filePaths.end() != itr1 ; ++itr1)
    {
    
      for(QStringList::const_iterator itr2 = filePaths.begin(); filePaths.end() != itr2 ; ++itr2)
      {
        if(*itr1 == *itr2)
        {
          continue;
        }
    
        if(itr2->startsWith(*itr1))
        {
          refinedPaths.removeAll(*itr2);
        }
      }
    }
    

答案 2 :(得分:0)

    filePaths.sort();
    for (int k = 0; k < filePaths.size(); )
    {
        const QString & path = filePaths[k];
        while(k+1 < filePaths.size() && filePaths.at(k+1).startsWith(path))
            filePaths.removeAt(k+1);
        k++;
    }

给定数据的速度提高约3倍