从QStringList中删除子目录,仅保留父母的目录
Remove Subdirectories from a QStringList and only keep their parents directories
我已经有目录路径的列表。例如:
/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
====================================================================
问题:
事件,我认为这不是大列表的最佳和最快的方法。
有没有最好的方法来完成这项工作?
nb:
- 我不在乎Windows或Ubunutu。
- 我使用QT 5.8 C 。
谢谢。
这是一个黑客:保留其中最小/
的路径
int pathDepth(const QString& path)
{
return std::count_if(path.begin(), path.end(), [](QChar c) { return c == '/'; });
}
QStringList getParentFolders(const QStringList& folderList)
{
QStringList ret;
int minDepth = pathDepth(*std::min_element(folderList.begin(), folderList.end(),
[](const QString& a, const QString& b){ return pathDepth(a) < pathDepth(b); }));
foreach (QString path, folderList)
if (pathDepth(path) == minDepth)
ret << path;
return ret;
}
沿这些行(使用std::vector
和std::string
代替QStringList
和QString
;适应QT类是读者的练习):
std::vector<std::string> v; // populated with directory paths
std::sort(v.begin(), v.end());
std::string root;
auto erase_from = std::unique(v.begin(), v.end(),
[&root](const std::string& a, const std::string& b) {
if (root.empty() || a.size() < root.size() || a.compare(0, root.size(), root) != 0) {
root = a;
}
return (b.size() >= root.size() && b.compare(0, root.size(), root) == 0);
}
);
v.erase(erase_from, v.end());
演示
第二个思考,使用std::remove_if
将更简单,更高效:
std::vector<std::string> v; // populated with directory paths
std::sort(v.begin(), v.end());
std::string root;
auto erase_from = std::remove_if(v.begin(), v.end(),
[&root](const std::string& dir) {
if (root.empty() || dir.size() < root.size() ||
dir.compare(0, root.size(), root) != 0) {
root = dir;
return false;
}
return true;
}
);
v.erase(erase_from, v.end())
demo
相关文章:
- 有根的二进制搜索树.保留与其父级的链接
- 为多个会话保留XPtr
- 保留对其他类的成员函数的引用
- 指针保留字符串
- 是否有内置方法可以强制转换为不同的基础类型,但保留常量限定符?
- 如何让 GCC/Clang 在保留标识符上出错
- 必须为 C++20 协程帧保留多少内存?
- 如何将一个窗口保留在另一个应用程序窗口的前面
- 使用 char 分隔符解析C++中的字符串,但将可重复的字符保留为每个解析的子字符串 (C++ STL) 中的分隔符
- 局部变量保留函数中的值
- 保留函数指针模板参数
- 变量超出范围后如何保留向量值?
- C++矢量复制构造函数和赋值运算符是否也复制保留空间?
- 当为可变性配置时,boost::heap::d_ary_heap 保留的额外 std::list 的目的是什么?
- 如何使用 swig 修改类构造函数以保留对其中一个构造函数参数的引用?
- 即使在使用 delete[] 后仍保留的元素
- 如何在成为指向基类的指针后保留对子类方法的使用?
- 将成员函数保留为未定义
- C++:如何为多个重载函数保留通用代码路径?
- 从QStringList中删除子目录,仅保留父母的目录