我有两个清单。两者都包含相同的值:
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);
不会删除列表中的任何字符串。
有什么想法吗?
答案 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
要改进的一些事项,
而不是逐个元素地复制QStringList,你可以使用复制构造函数,即从filePaths复制到refinePaths QStringList refinedPaths(filePaths);
使用迭代器而不是按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倍