如何删除QStringList中的冗余元素

时间:2016-12-22 23:12:42

标签: c++ qt

我努力找到一个安全的解决方案(害怕迭代器无效)来删除QStringList中的一些元素:

static QStringList s_listDistantDirs;

如果元素CurrentElement的长度优于其他元素OtherElementOtherElement等于CurrentElement.mid(OtherElement.length()),我想删除它。

换句话说,我想删除列表中现有目录的子目录。

我尝试使用QMutableListIterator<QString>,但我不知道如何正确使用它来嵌套循环。

2 个答案:

答案 0 :(得分:2)

  

换句话说,我想删除列表中现有目录的子目录。

如果事先知道现有目录,您可以使用QStringList::filter()和这样的正则表达式:

#include <QtCore>
#include <QRegularExpression>
#include <QStringList>
#include <QDebug>

int main() {
  QString myPath("/my/path/");
  QRegularExpression re("^(?!" + myPath + ")");
  QStringList list = (QStringList()
    << "/my/path/a"
    << "/my/path/b"
    << "/some/other/path/c"
    << "/my/path/d");
  for(auto &l: list.filter(re)) {
    qDebug() << l;
  }
}

答案 1 :(得分:2)

你可能想要这样的东西:

static QStringList s_listDistantDirs;
//...
QStringListIterator it(s_listDistantDirs);
while (it.hasNext()) {
    QString& otherElement = it.next().value();
    // QMutableStringListIterator is just a typedef for QMutableIterator<QString>
    QMutableStringListIterator mit(s_listDistantDirs);
    while(mit.hasNext()) {
        QString& currentElement = mit.next().value();
        if (currentElement.length() > otherElement.length()
            && currentElement.startsWith(otherElement))
                mit.remove(); // this will not invalidate `it`!
    }
}

根据Qt documentation

  

可以在同一列表中使用多个迭代器。如果在QListIterator处于活动状态时修改了列表,则QListIterator将继续迭代原始列表,忽略修改后的副本。

但效率很低,此时最好只使用一些数据结构,比如前缀树。