如果字符串值是其他字符串的一部分,则从QStringList中删除字符串

如果字符串值是其他字符串的一部分,则从QStringList中删除字符串,string,qt,String,Qt,如果某个字符串包含在同一列表中的另一个字符串中,我想从QStringList(下面代码中的文件夹)中删除该字符串 示例:“/tmp/a/tmp/b/tmp/a/aa/tmp/c/tmp/a/aa/aaa/tmp/d” 我想删除第一个和第三个字符串,因为它们包含在第五个字符串中。 我知道如何在bash中使用grep,但是如何使用Qt呢 void MainWindow::on_toolButtonSourceFolders_clicked() { QString startDir = lin

如果某个字符串包含在同一列表中的另一个字符串中,我想从QStringList(下面代码中的文件夹)中删除该字符串

示例:“/tmp/a/tmp/b/tmp/a/aa/tmp/c/tmp/a/aa/aaa/tmp/d”

我想删除第一个和第三个字符串,因为它们包含在第五个字符串中。 我知道如何在bash中使用grep,但是如何使用Qt呢

void MainWindow::on_toolButtonSourceFolders_clicked()
{
    QString startDir = lineEditStartFolder->text();
    QFileDialog* folderDialog = new QFileDialog(this);
    folderDialog->setDirectory(lineEditStartFolder->text());
    folderDialog->setFileMode(QFileDialog::Directory);
    folderDialog->setOption(QFileDialog::DontUseNativeDialog, true);
    folderDialog->setOption(QFileDialog::ShowDirsOnly, true);
    folderDialog->setOption(QFileDialog::DontResolveSymlinks, true);
    QListView *folderList = folderDialog->findChild<QListView*>("listView");
    if (folderList) {
        folderList->setSelectionMode(QAbstractItemView::MultiSelection);
    }
    QTreeView *folderTree = folderDialog->findChild<QTreeView*>();
    if (folderTree) {
        folderTree->setSelectionMode(QAbstractItemView::MultiSelection);
    }

    folderDialog->exec();
    QStringList folders = folderDialog->selectedFiles();
    if (!folders.isEmpty())
            listWidget->addItems(folders);
}
void主窗口::在工具按钮源文件夹上单击()
{
QString startDir=lineEditStartFolder->text();
QFileDialog*folderDialog=新建QFileDialog(此);
folderDialog->setDirectory(lineEditStartFolder->text());
folderDialog->setFileMode(QFileDialog::Directory);
folderDialog->setOption(QFileDialog::DontUseNativeDialog,true);
folderDialog->setOption(QFileDialog::ShowDirsOnly,true);
folderDialog->setOption(QFileDialog::DontResolveSymlinks,true);
QListView*folderList=folderDialog->findChild(“listView”);
if(文件夹列表){
folderList->setSelectionMode(QAbstractItemView::MultiSelection);
}
QTreeView*folderTree=folderDialog->findChild();
if(folderTree){
folderTree->setSelectionMode(QAbstractItemView::MultiSelection);
}
folderDialog->exec();
QStringList folders=folderDialog->selectedFiles();
如果(!folders.isEmpty())
listWidget->addItems(文件夹);
}

如注释所示,完整的代码可以在

上找到,因为目录的最大数量是20个,我不会费心优化算法,因此我只选择最简单的:

QStringList folders = folderDialog->selectedFiles();
QStringList outputFolders = folders;
foreach (const QString &folder, folders) {
    foreach (const QString &f, folders) {
        if (f.contains(folder))
            outputFolders.removeOne(folder);
    }
}
您也可以避免使用临时副本,但同样,这会使代码更加复杂,不值得使用20个“文件夹”


另外,请注意,“文件夹”是一个GUI术语。你指的是更通用的文件和目录。最好使用正确的术语,不要只使用GUI术语。

稍加修改,我就解决了这个问题:

QStringList folders = folderDialog->selectedFiles();
QStringList outputFolders = folders;
foreach (const QString &folder, folders) {
    foreach (const QString &f, folders) {
        const QString &cfolder = (folder + "/");
        if (f.contains(cfolder))
            outputFolders.removeOne(folder);
    }
}
if (!outputFolders.isEmpty())
        listWidget->addItems(outputFolders);

如何将第三个“包含”在另一个文件夹中?您的任务描述不准确,但即使如此:真正的用例是什么?请检查QStringList::filter(const QString&str,Qt::CaseSensitivity cs=Qt::CaseSensitive),您也可以使用正则表达式。@Final Contest:谢谢您的提示。我已经修复了“第三个”文件夹。最后一个应用程序将用于将文件夹合并到基于squashfs的文件中。我已经在github的complete代码中添加了url。这个算法必须运行良好吗?在最坏的情况下,您有多少文件夹?最慢的算法是O(n^2),否则如果尚未排序,排序可能会加快速度。您还可以构建一个Trie并保留叶节点。@最终竞赛:我将估计文件夹的最大数量
removeOne
contains
可能是O(n),因此您的代码将是O(n^3),即使只有20个项目,这看起来也很糟糕,而且由于您没有处理
f==文件夹的情况,因此,列表将始终为空。@Alexism:谢谢您的宝贵意见。你说得对@决赛:非常感谢你的回答!稍加修改,我就解决了我的问题DY您不应该对目录使用
contains
,而应该使用
startsWith
(例如,字符串
/tmp/tmp/a/b
包含
/tmp/a
,这不是您想要的内容)。@Alexism:再次感谢您的下一条宝贵评论:D