删除QJsonArray中的所有元素

时间:2017-07-11 11:14:40

标签: c++ qt

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

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

我得到了这个输出:

(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.任何想法?

感谢。

3 个答案:

答案 0 :(得分:6)

您的代码:

for(int i=0;i<array->count();i++) {
    array->removeAt(i);
}

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

 for(int i=0; i<array->count(); i++) {
     array->removeAt(0);
 }

 while(array->count()) {
     array->pop_back();
 }

只要想想你的周期:它会删除0索引处的第一个元素。在removeAt调用之后,你的数组会被缩小并向左移动一步。第1个指数变为0,第2个变为第1个,依此类推。所以,在下一次迭代中,当你的i变为1时,它实际上指向前者2.所以你将删除第一和第三个元素,第二个和第四个将被i ++跳过。

你删除的样子(^是i指针):

|0|1|2|3|
 ^

|1|2|3|
   ^

|1|3|
     ^

答案 1 :(得分:0)

如果使用pointer

*array = QJsonArray();

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

array = QJsonArray();

答案 2 :(得分:0)

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

 int len=array->count();
 for(int i=0; i<len; i++) {
     array->removeAt(0);
 }

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