MEMO
QListに入れたQMapをソートするサンプルです
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QtAlgorithms>
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
// keyで降順に比較する比較関数
bool compareMapsDescending(const QMap<QString, QString> &map1, const QMap<QString, QString> &map2, const QString &key) {
bool isNumber1 = map1.value(key).toInt();
bool isNumber2 = map2.value(key).toInt();
if (isNumber1 && isNumber2) {
// 数値で比較
return map1.value(key).toInt() > map2.value(key).toInt();
} else {
// 文字列で比較
return map1.value(key) > map2.value(key);
}
}
// keyで昇順に比較する比較関数
bool compareMapsAscending(const QMap<QString, QString> &map1, const QMap<QString, QString> &map2, const QString &key) {
bool isNumber1 = map1.value(key).toInt();
bool isNumber2 = map2.value(key).toInt();
if (isNumber1 && isNumber2) {
// 数値で比較
return map1.value(key).toInt() < map2.value(key).toInt();
} else {
// 文字列で比較
return map1.value(key) < map2.value(key);
}
}
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "./ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
QMap<QString, QString> dataMap;
QList<QMap<QString, QString>> dataList;
// dataListの初期化
dataMap.insert("id", "0");
dataMap.insert("key1", "100");
dataMap.insert("key2", "10");
dataList.append(dataMap);
dataMap.clear();
dataMap.insert("id", "1");
dataMap.insert("key1", "100");
dataMap.insert("key2", "20");
dataList.append(dataMap);
dataMap.clear();
dataMap.insert("id", "2");
dataMap.insert("key1", "200");
dataMap.insert("key2", "20");
dataList.append(dataMap);
dataMap.clear();
dataMap.insert("id", "3");
dataMap.insert("key1", "300");
dataMap.insert("key2", "10");
dataList.append(dataMap);
qDebug() << "-----";
for (auto &list : dataList) qDebug() << "[" << list.value("id") << list.value("key1") << list.value("key2") << "]";
// (1) key1で降順にソートする
std::sort(dataList.begin(), dataList.end(), [&](const QMap<QString, QString> &map1, const QMap<QString, QString> &map2) {
const QString key = "key1";
return compareMapsDescending(map1, map2, key);
});
qDebug() << "-(1)----";
for (auto &list : dataList) qDebug() << "[" << list.value("id") << list.value("key1") << list.value("key2") << "]";
// (2) key2で昇順にソートする
std::sort(dataList.begin(), dataList.end(), [&](const QMap<QString, QString> &map1, const QMap<QString, QString> &map2) {
const QString key = "key2";
return compareMapsAscending(map1, map2, key);
});
qDebug() << "-(2)----";
for (auto &list : dataList) qDebug() << "[" << list.value("id") << list.value("key1") << list.value("key2") << "]";
// idで昇順にソートする
std::sort(dataList.begin(), dataList.end(), [&](const QMap<QString, QString> &map1, const QMap<QString, QString> &map2) {
const QString key = "id";
return compareMapsAscending(map1, map2, key);
});
qDebug() << "-----";
for (auto &list : dataList) qDebug() << "[" << list.value("id") << list.value("key1") << list.value("key2") << "]";
// (3) key1で降順かつkey2で昇順にソートする
std::sort(dataList.begin(), dataList.end(), [&](const QMap<QString, QString> &map1, const QMap<QString, QString> &map2) {
const QString key_1 = "key1";
const QString key_2 = "key2";
if (map1.value(key_1).toInt() > map2.value(key_1).toInt()) { // key1で降順
return true;
}
else if ((map1.value(key_1).toInt() == map2.value(key_1).toInt())
&& (map1.value(key_2).toInt() < map2.value(key_2).toInt())) { // key2で昇順
return true;
} else {
return false;
}
});
qDebug() << "-(3)----";
for (auto &list : dataList) qDebug() << "[" << list.value("id") << list.value("key1") << list.value("key2") << "]";
// (4) key2で降順かつkey1で昇順にソートする
std::sort(dataList.begin(), dataList.end(), [&](const QMap<QString, QString> &map1, const QMap<QString, QString> &map2) {
const QString key_1 = "key1";
const QString key_2 = "key2";
if (map1.value(key_2).toInt() > map2.value(key_2).toInt()) { // key2で降順
return true;
}
else if ((map1.value(key_2).toInt() == map2.value(key_2).toInt())
&& (map1.value(key_1).toInt() < map2.value(key_1).toInt())) { // key1で昇順
return true;
} else {
return false;
}
});
qDebug() << "-(4)----";
for (auto &list : dataList) qDebug() << "[" << list.value("id") << list.value("key1") << list.value("key2") << "]";
// (5) key1で昇順かつkey2で降順にソートする
std::sort(dataList.begin(), dataList.end(), [&](const QMap<QString, QString> &map1, const QMap<QString, QString> &map2) {
const QString key_1 = "key1";
const QString key_2 = "key2";
if (map1.value(key_1).toInt() < map2.value(key_1).toInt()) { // key1で昇順
return true;
}
else if ((map1.value(key_1).toInt() == map2.value(key_1).toInt())
&& (map1.value(key_2).toInt() > map2.value(key_2).toInt())) { // key2で降順
return true;
} else {
return false;
}
});
qDebug() << "-(5)----";
for (auto &list : dataList) qDebug() << "[" << list.value("id") << list.value("key1") << list.value("key2") << "]";
// (6) key2で昇順かつkey1で降順にソートする
std::sort(dataList.begin(), dataList.end(), [&](const QMap<QString, QString> &map1, const QMap<QString, QString> &map2) {
const QString key_1 = "key1";
const QString key_2 = "key2";
if (map1.value(key_2).toInt() < map2.value(key_2).toInt()) { // key2で昇順
return true;
}
else if ((map1.value(key_2).toInt() == map2.value(key_2).toInt())
&& (map1.value(key_1).toInt() > map2.value(key_1).toInt())) { // key1で降順
return true;
} else {
return false;
}
});
qDebug() << "-(6)----";
for (auto &list : dataList) qDebug() << "[" << list.value("id") << list.value("key1") << list.value("key2") << "]";
}
MainWindow::~MainWindow()
{
delete ui;
}
重要
数値は.toInt()で文字列から数値に変換して大小比較する アプリケーション出力
—–[ “0” “100” “10” ]
[ “1” “100” “20” ]
[ “2” “200” “20” ]
[ “3” “300” “10” ]
-(1)—-
[ “3” “300” “10” ]
[ “2” “200” “20” ]
[ “0” “100” “10” ]
[ “1” “100” “20” ]
-(2)—-
[ “3” “300” “10” ]
[ “0” “100” “10” ]
[ “2” “200” “20” ]
[ “1” “100” “20” ]
—–
[ “0” “100” “10” ]
[ “1” “100” “20” ]
[ “2” “200” “20” ]
[ “3” “300” “10” ]
-(3)—-
[ “3” “300” “10” ]
[ “2” “200” “20” ]
[ “0” “100” “10” ]
[ “1” “100” “20” ]
-(4)—-
[ “1” “100” “20” ]
[ “2” “200” “20” ]
[ “0” “100” “10” ]
[ “3” “300” “10” ]
-(5)—-
[ “1” “100” “20” ]
[ “0” “100” “10” ]
[ “2” “200” “20” ]
[ “3” “300” “10” ]
-(6)—-
[ “3” “300” “10” ]
[ “0” “100” “10” ]
[ “2” “200” “20” ]
[ “1” “100” “20” ]