Сортировать массив QJsonArray по одному из его дочерних элементов. - PullRequest
0 голосов
/ 31 января 2019

Как реализовать пользовательскую сортировку QJsonArray на основе одного из его дочерних элементов?

У меня есть QJsonArray toys на основе этого JSON:

"toys": [
    {
        "type": "teddy",
        "name": "Thomas",
        "size": 24
    },
    {
        "type": "giraffe",
        "name": "Jenny",
        "size": 28
    },
    {
        "type": "alligator",
        "name": "Alex",
        "size": 12
    }
]

Я хочу отсортироватьэто в алфавитном порядке "name".

Я пробовал это:

std::sort(toys.begin(), toys.end(), [](const QJsonObject &v1, const QJsonObject &v2) {
    return v1["name"].toString() < v2["name"].toString();
});

, но это вызывает много ошибок.

1 Ответ

0 голосов
/ 31 января 2019

Есть пара вещей, которые нужно исправить.Во-первых, вот мое решение и ниже некоторые пояснения:

Решение

inline void swap(QJsonValueRef v1, QJsonValueRef v2)
{
    QJsonValue temp(v1);
    v1 = QJsonValue(v2);
    v2 = temp;
}

std::sort(toys.begin(), toys.end(), [](const QJsonValue &v1, const QJsonValue &v2) {
    return v1.toObject()["name"].toString() < v2.toObject()["name"].toString();
});

Объяснение

Аргументы сравнения

Одна из ошибок, которые у вас были:

no matching function for call to object of type '(lambda at xxxxxxxx)'
        if (__comp(*--__last, *__first))
            ^~~~~~

...

candidate function not viable: no known conversion from 'QJsonValueRef' to 'const QJsonObject' for 1st argument
std::sort(toys.begin(), toys.end(), [](const QJsonObject &v1, const QJsonObject &v2) {
                                    ^
...

Итератор не знает, что ваши элементы массива имеют тип QJsonObject.Вместо этого он видит их как общий тип QJsonValue.Нет автоматического преобразования в QJsonObject, поэтому выдается ошибка с вашей лямбда-функцией.

Замените const QJsonObject & на const QJsonValue & для обоих лямбда-аргументов.Затем обработайте преобразование в QJsonObject тип явно в теле функции: v1.toObject()... вместо v1....

Нет функции подкачки!

Одна из ваших ошибок:

no matching function for call to 'swap'
            swap(*__first, *__last);
            ^~~~

Как обсуждалось в отчете об ошибке Qt QTBUG-44944 , Qt не предоставляет реализацию для переключения между двумя QJsonValue элементами в массиве.Благодаря репортеру об ошибках Кейту Гарднеру мы можем включить нашу собственную функцию подкачки.Как предлагается в отчете, вы можете поместить это как встроенную функцию в глобальный заголовочный файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...