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

时间:2014-07-22 08:15:53

标签: 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 = 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);
}

完整代码位于https://github.com/FluxFlux/qdir2mod

2 个答案:

答案 0 :(得分:1)

如评论中所示,由于最大目录数为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&#34;文件夹&#34;而言是不值得的。

另外,请注意&#34;文件夹&#34;是一个GUI术语。你所指的是更普遍的文件和目录。最好使用正确的术语,而不是仅仅使用GUI术语。

答案 1 :(得分:1)

稍作修改,我就解决了问题:

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