2017-07-11 32 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 

私は本当にない2と4任意のアイデアをオブジェクト1と3が削除されている理由を理解、しかしないのですか?

ありがとうございました。

答えて

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呼び出し後に配列が縮小され、1ステップだけ左に移動します。 1番目のインデックスは0になり、2番目のインデックスは1番目となります。したがって、次の反復では、iが1になると、実際には元の2を指しています。したがって、1番目と3番目の要素を削除し、2番目と4番目はi ++でスキップされます。あなたの削除がどのように見えるかだ

(^はiポインタです): `*配列= QJsonArray {}について

|0|1|2|3| 
^ 

|1|2|3| 
^

|1|3| 
    ^
+2

方法;'? – nwp

+0

ありがとうございます! – highvoltage379

+1

@nwpはい、間違いなく動作するはずです。ポイントは、実際に質問は 'QJsonArray'ではなく、このようなコンテナに関連しているということです。プログラマは、このような間違いを避けるために、上記のようなコードは間違っていると理解していなければなりません。 'QJsonArray'は' clear() 'のようなものを持たないので、あなたのバリアントはこのケースの最短です。 –

関連する問題