QMap或结构体根据value排序

需求:       

        QMap是Qt的一个关联式容器,可以用于存储键值对,并提供了快速的查找和访问方式。当我们向QMap中插入元素时,默认按照键值对的大小升序排序。

        如果我们现在有一个这样一个需求,QMap<QString, double> map,存储的数据为名字对应值,如:(apple, 12.2),(orange, 23.3),(banana, 10.5)。 现在需要按照map元素值的升序的顺序获取QMap中的所有元素,也就是希望获得的结果是: (banana, 10.5),(apple, 12.2),(orange, 23.3)。


思路:

        std::sort()可以实现对容器排序,但是无法对QMap使用std::sort()。我们可以先将QMap中的元素放入到QVector,然后再对QVector进行排序,最终获得排序后的数据。


实现:

QMap<QString, double> testMap;
testMap.insert("apple", 12.2);
testMap.insert("banana", 10.5);
testMap.insert("orange", 23.3);

// 数据转入QVector
QVector<QPair<QString, double>> fruit;
for (auto it = testMap.begin(); it != testMap.end(); ++it)
{
    QPair<QString, double> temp(it.key(), it.value());
    fruit.append(temp);
}

qDebug() << "sort之前" << fruit;
std::sort(fruit.begin(), fruit.end(), [](QPair<QString, double> ele1, QPair<QString, double> ele2){
    return ele1.second < ele2.second;
});
qDebug() << "sort之后" << fruit;

        排序的关键在于qSort第三个参数的编写,它是一个匿名函数,用来判断元素的大小。 为了方便,这里使用了lambda表达式。代码输出结果:

         根据这个思路,同样的我们可以排序一个结构体:

struct stu_Point
{
    double fPointX;         // X坐标
    double fPointY;         // Y坐标
    double fPointValue;     // 坐标值

    stu_Point(double x, double y, double value)
        :fPointX(x),
        fPointY(y),
        fPointValue(value)
    {}
};

QVector<stu_Point> point;
stu_Point point1(1.3, 1.3, 12.2);
stu_Point point2(1.1, 1.1, 10.5);
stu_Point point3(1.5, 1.5, 23.3);
point.append(point1);
point.append(point2);
point.append(point3);

qDebug() << "sort之前 ";
foreach (auto var, point) {
    qDebug() << var.fPointValue;
}
std::sort(point.begin(), point.end(), [](stu_Point ele1, stu_Point ele2){
    return ele1.fPointValue < ele2.fPointValue;
});
qDebug() << "sort之后 ";
foreach (auto var, point) {
    qDebug() << var.fPointValue;
}

 

`QMap<QString, double>`是一个Qt库中的关联容器,它存储字符串(QString)作为键和双精度浮点数(double)作为值。如果你想按照数字部分的大小顺序来输出键值对,需要注意的是,直接比较字符串形式的数字可能会出现问题,因为它们通常是不可比较的。 一种解决方法是先将字符串转换为可以比较的数值类型(例如整型浮点型),然后再排序。这里提供一个简化的步骤: 1. 创建一个辅助函数来解析字符串并获取其数字部分(如果有的话): ```cpp int parseInt(const QString& str) { return str.toInt(); // 如果字符串可以转换为整数 // 者: // doubletoDouble(str); // 如果需要处理浮点数 } ``` 2. 遍历QMap,并使用辅助函数获取数字: ```cpp for (auto it = QMap.begin<QString, double>(); it != QMap.end(); ++it) { int keyNumericValue = parseInt(it.key()); std::cout << "Key: " << it.key() << ", Value: " << it.value() << ", Numeric Order: " << keyNumericValue << std::endl; } ``` 3. 使用标准库提供的算法对元素进行排序,比如你可以创建一个新的map来保存排序后的数据,然后逐一对比原map的键和新排序好的键对应的索引位置: ```cpp std::vector<std::pair<QString, double>> sortedPairs; sortedPairs.reserve(QMap.size()); // 添加到vector中 while (!QMap.empty()) { sortedPairs.push_back(*QMap.begin()); QMap.erase(QMap.begin()); } // 按照数字值排序 std::sort(sortedPairs.begin(), sortedPairs.end(), [](const auto& pair1, const auto& pair2) { return parseInt(pair1.first) < parseInt(pair2.first); }); // 输出排序后的结果 for (const auto& sortedPair : sortedPairs) { std::cout << "Sorted Key: " << sortedPair.first << ", Value: " << sortedPair.second << std::endl; } ``` 注意,这种方法假设输入的字符串能够有效转换成整数浮点数。如果不能转换,上述代码将会出错。另外,如果你有特殊的排序需求,如忽略非数字字符按照小数部分排序,那么解析过程会更复杂一些。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值