2017-07-11 165 views
0

我想从QJsonArray中删除所有元素,并且遇到比我想象的更麻烦的事情。这里是我的代码:删除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。任何想法?

谢谢。

回答

5

您的代码:

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之后立刻动手,您的阵列减少并向左移动一步。第一个索引变为0,第二个索引变为第一个等等。因此,在下一次迭代中,当您的i变为1时,它实际上指向前者2.因此,您将删除第1个和第3个元素,第2个和第4个将被i ++跳过。

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

|0|1|2|3| 
^ 

|1|2|3| 
^

|1|3| 
    ^
+2

怎么样'*阵列= QJsonArray {};'? – nwp

+0

非常感谢! – highvoltage379

+1

@nwp是的,这绝对应该工作。问题的关键在于这个问题实际上不是关于'QJsonArray',而是与这样的任何容器有关。程序员应该明白像上面这样的_why_代码是不正确的,以避免将来出现这样的错误。奇怪的是'QJsonArray'没有'clear()'这样的东西,所以你的变体是这种情况下最短的。 –