QString :: startWith () & QStringList :: removeAll () не работает должным образом - PullRequest
1 голос
/ 07 сентября 2011

У меня есть два списка.Оба содержат одинаковые значения:

 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);
     }
   }
 }

Я ожидаю, что произойдет следующее: * Перебирать строки в списке, сравнивая каждый элемент в списке друг с другом.* Если строка1 начинается со строки2 (следовательно, строка2 является родительским каталогом строки1) * удалить эту строку из «уточненного» списка строк.

Однако, происходит то, что if(str2.startsWith(str1)) каждый раз возвращает true, иrefinedPaths.removeAll(str2); не удаляет строки в списке.

Есть идеи?

Ответы [ 3 ]

2 голосов
/ 07 сентября 2011

Фрагмент ниже рационализирует список в соответствии с требованиями на месте.

   foreach (const QString& path, filePaths)
   {
      foreach (const QString& other, filePaths)
      {
         if (other != path && other.startsWith(path))
            filePaths.removeOne (other);
      }
   }
1 голос
/ 07 сентября 2011

Ваш код работает нормально, не знаю, на какую проблему вы ссылаетесь. Используя ваш код, я получил вывод

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

Несколько вещей, которые нужно улучшить,

  1. вместо копирования элемента QStringList за элементом, вы можете просто использовать конструктор копирования, т.е. копирование из filePaths в refinedPaths QStringList refinedPaths(filePaths);

  2. использовать итераторы вместо итерации по размеру ().

    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);
        }
      }
    }
    
0 голосов
/ 07 сентября 2011
    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 раза быстрее по заданным данным

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...