首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除QJsonArray中的所有元素

删除QJsonArray中的所有元素
EN

Stack Overflow用户
提问于 2017-07-11 19:14:40
回答 3查看 4.6K关注 0票数 0

我想删除QJsonArray中的所有元素,但我遇到的麻烦比我想象的要多得多。下面是我的代码:

代码语言:javascript
复制
void Assessment::clearQJsonArray(QJsonArray *array) {
  printQJsonArray(*array);
  for(int i=0;i<array->count();i++) {
      array->removeAt(i);
  }

  qDebug() << "Test clear:" << array->count();

  printQJsonArray(*array);
}

void Assessment::printQJsonArray(QJsonArray array) {
  QJsonDocument doc;
  doc.setArray(array);
  qDebug() << doc.toJson();
}

void Assessment::testClearQJsonArray() {
QJsonArray array;
QJsonObject obj1, obj2, obj3, obj4;

obj1.insert("number",1);
obj2.insert("number",2);
obj3.insert("number",3);
obj4.insert("number",4);

array.append(obj1);
array.append(obj2);
array.append(obj3);
array.append(obj4);

qDebug() << "Before clear";
qDebug() << "Test size:" << array.count();

QJsonObject element;

for(int i=0;i<array.count();i++) {
    element = array.at(i).toObject();
    qDebug() << element.value("number").toInt();
}

clearQJsonArray(&array);
qDebug() << "After clear";

for(int i=0;i<array.count();i++) {
    element = array.at(i).toObject();
    qDebug() << element.value("number").toInt();
}
qDebug() << "Test size:" << array.count();
}

我得到了这个输出:

代码语言:javascript
复制
(void Assessment::testClearQJsonArray()): Before clear
(void Assessment::testClearQJsonArray()): Test size: 4
(void Assessment::testClearQJsonArray()): 1
(void Assessment::testClearQJsonArray()): 2
(void Assessment::testClearQJsonArray()): 3
(void Assessment::testClearQJsonArray()): 4
(void Assessment::printQJsonArray(QJsonArray)): "[\n    {\n        \"number\": 1\n    },\n    {\n        \"number\": 2\n    },\n    {\n        \"number\": 3\n    },\n    {\n        \"number\": 4\n    }\n]\n"
(void Assessment::clearQJsonArray(QJsonArray*)): Test clear: 2
(void Assessment::printQJsonArray(QJsonArray)): "[\n    {\n        \"number\": 2\n    },\n    {\n        \"number\": 4\n    }\n]\n"
(void Assessment::testClearQJsonArray()): After clear
(void Assessment::testClearQJsonArray()): 2
(void Assessment::testClearQJsonArray()): 4
(void Assessment::testClearQJsonArray()): Test size: 2

我真的不明白为什么对象1和3被移除了,而对象2和4却没有被移除。

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-07-11 19:23:13

你的代码:

代码语言:javascript
复制
for(int i=0;i<array->count();i++) {
    array->removeAt(i);
}

你在这里做错了。它应该是:

代码语言:javascript
复制
 for(int i=0; i<array->count(); i++) {
     array->removeAt(0);
 }

代码语言:javascript
复制
 while(array->count()) {
     array->pop_back();
 }

想一想你的循环做了什么:它删除了索引为0的第一个元素。在removeAt调用之后,你的数组立即减少并左移了一步。第一个索引变成0,第二个变成第一个,以此类推。因此,在下一次迭代中,当您的i变为1时,它实际上指向前一个2。因此,您将删除第一个和第三个元素,而i++将跳过第二个和第四个元素。

这就是删除操作的外观(^是一个i指针):

代码语言:javascript
复制
|0|1|2|3|
 ^

|1|2|3|
   ^

|1|3|
     ^
票数 6
EN

Stack Overflow用户

发布于 2019-07-28 13:28:50

如果您使用过pointer

代码语言:javascript
复制
*array = QJsonArray();

而且,如果您有一个简单的QJsonArray对象:

代码语言:javascript
复制
array = QJsonArray();
票数 0
EN

Stack Overflow用户

发布于 2021-05-28 05:11:30

答案中的while循环是正确的,但两个for循环都是错误的。问题是,您的循环在每次循环中递增i,而array->count()每次在循环中递减。这会导致它们在中间相遇,因此您只删除了数组中的一半元素。要解决这个问题,你可以使用一个变量。

代码语言:javascript
复制
 int len=array->count();
 for(int i=0; i<len; i++) {
     array->removeAt(0);
 }

或者更好的是,只使用while循环。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45032978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档