【发布时间】:2017-07-24 15:22:10
【问题描述】:
我已经有一个目录路径列表。例如:
/home/aar/las
/home/aar/las/pes
/home/aar/las/fmp
/home/aar/.thumbnails
/home/aar/.thumbnails/normal
/home/aar/yfolder
/home/aar/.kde
/home/aar/.kde/share
/home/aar/.kde/share/config
/home/aar/.kde/share/apps
/home/aar/.kde/share/apps/okular
我想删除所有子目录并只保留父目录。
为此,我使用了运行良好的代码:
QStringList RemoveSubFolders_KeepParentFolders(QStringList FoldersList)
{
QStringList FoldersList_First = FoldersList;
QStringList FoldersList_Second = FoldersList;
QStringList ToDelete;
foreach (QString TheFolder_First, FoldersList_First) {
foreach (QString TheFolder_Second, FoldersList_Second) {
if (TheFolder_Second.startsWith(TheFolder_First) && TheFolder_First.toLower() != TheFolder_Second.toLower())
ToDelete.append(TheFolder_Second);
}
}
QStringListIterator i(ToDelete);
while(i.hasNext()){
FoldersList.removeAll(i.next());
}
return FoldersList; //return list without subfolders
}
结果是:
/home/aar/las
/home/aar/.thumbnails
/home/aar/yfolder
/home/aar/.kde
================================================ =========
问题:
尽管如此,我认为对于大型列表来说,这并不是最好和最快的方式。
有没有最好的方法来完成这项工作?
注意:
- 我不关心 Windows 或 Ubunutu。
- 我使用 Qt 5.8 c++。
谢谢。
【问题讨论】:
-
(1) 子目录是否总是紧跟在列表中的目录之后,就像您的示例一样?换句话说,
/a ; /b ; /a/x可能吗? (2) 最终列表中的顺序是否重要?换句话说,如果您以/b ; /b/x ; /a开头,是否可以以/a ; /b结尾而不是/b ; /a? -
@IgorTandetnik (1) 我不确定 (2) 订单将是一件好事,但没有必要。
-
您可以复制路径中
/最少的文件夹。
标签: c++ list qt for-loop qstring