【问题标题】:remove line from Qstring从 Qstring 中删除行
【发布时间】:2015-04-19 11:27:38
【问题描述】:

我有一个 5 行的 QString

“AAAA”

“BBBBB”

“CCCRC”

“DDDDD”

“EEEEE”

我只想用 2 到 4 行搜索“R”字符如果其中一个内容为“R”,则从我的 QString 中删除该行

我尝试了很多方法,但都没有成功。

【问题讨论】:

  • 显示您下次尝试的内容...

标签: qt


【解决方案1】:

你可以为每一行分割字符串,给你一个QStringList,里面有5个字符串。然后从 2 到 4 迭代,如果字符串包含R,则从字符串列表中删除该字符串,最后重新加入字符串列表。

  QString s("AAAAAR\nBBBBB\nCCCRC\nDDDDD\nEEEEE");
  QStringList l = s.split('\n');
  int i = 1, stop = 4;
  while (i < stop) {
      if (!l[i].contains('R')) ++i;
      else {
          l.removeAt(i);
          --stop;
        }
    }
  s = l.join('\n');

这个解决方案应该更灵活,无论输入如何都可以工作,只需选择您想要签入的范围。

具有讽刺意味的是,如果循环反向迭代,则留下孔并跟踪总计数没有问题。

for (int i = 3; i > 0; --i) if (l[i].contains('R')) l.removeAt(i);

【讨论】:

  • 如果您像这样调用l.removeAt(i);,您将立即缩短列表,因此下一次迭代将检查EEEEE,而不是DDDDD。此外,如果您有&lt;3,那么您实际上只检查12 而不是列表中的元素2-4
  • @Erik - 很好,当我打字的时候我还在半睡半醒。
  • 我提到的另一个问题仍然存在:您没有检查元素 2-4,而只检查了 2 和 3,并且只是因为您碰巧删除了第 3 个,所以您还检查了第 4 个。如果您将AAAAAR\nBBBBB\nDDDDD\nCCCRC\nEEEEE 作为字符串而不是原始字符串传递,则您的代码在第四个位置时找不到匹配项。只需将 &lt; 3 更改为 `
  • @Erik - 不,我不喜欢这样,因为它仍然与静态场景相关联,如果它发生变化很容易导致崩溃。它与输入字符串AAAAAR\nBBRBB\nDDRDD\nCCCCC\nEEEEE 一起崩溃。我想我将不得不使用不止一行,因为我不想这样做:)
  • 你能给我写信吗?如何检查一行是否有字符> 'R' 如果是,请删除该行。每个答案都帮助我了解 QT
【解决方案2】:

类似于 ddriver 的解决方案,但使用了迭代器

#include <QApplication>
#include <QString>
#include <QStringList>
#include <QtCore>

int main(int argc, char** argv)
{
  QApplication app(argc,argv);

  QString s("AAAAAR\nBBBBB\nCCCRC\nDDDDD\nEEEEE");
  QStringList l = s.split('\n');
  for( QStringList::iterator it = ++l.begin(); it != --l.end(); ) {
    if( it->contains('R') ) {
      it = l.erase(it);
    } else {
      ++it;
    }
  }

  s = l.join("\n");
  qDebug() << l;
  return app.exec();
}

输出:

("AAAAAR", "BBBBB", "DDDDD", "EEEEE") 

我不在for 循环中增量使用,而是使用 QList::erase(iterator pos) 其中Removes the item associated with the iterator pos from the list, and returns an iterator to the next item in the list

我更一般地假设您希望从第二个到倒数第二个元素循环,而不考虑元素的数量。

编辑:如果你想移动容器中的特定元素,你可以例如使用std::advance

#include <QApplication>
#include <QString>
#include <QStringList>
#include <QtCore>

#include <iterator>



int main(int argc, char** argv)
{
  QApplication app(argc,argv);

  QString s("AAAAAR\nBBBBB\nCCCRC\nDDDDD\nEEEEE");
  QStringList l = s.split('\n');
  QStringList::iterator it = l.begin();
  QStringList::iterator itEnd = l.begin();
  std::advance(it,2); // set the number to whatever start position you want
  std::advance(itEnd,4); // set the number to whatever end position you want
  for(  ; it != itEnd ; ) {
    if( it->contains('R') ) {
      it = l.erase(it);
    } else {
      ++it;
    }
  }

  s = l.join("\n");
  return app.exec();
}

【讨论】:

  • 代码运行良好,但本例中只有 5 个字符。
  • 代码运行良好,但在只有 5 行的情况下如果我有 100 行,我只想检查 30 到 50 的行并删除带有 Char 'R' 的行,那么我不能使用“ it != --l.end(); " 修改代码更通用的简单方法吗?
  • 有固定的场景还是这些位置一直在变化?我的意思是:你总是有 100 个元素并且总是想要搜索位置 30 到 50 还是这些东西会有所不同?
  • @Mystery 我添加了另一个示例,您可以在其中选择开始和结束位置
  • 我并不总是有 100 行,搜索位置也不同,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-03
  • 2015-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多