map的键值排序问题

前段时间需要用java开发一个公司系统服务的SDK,其中碰到了一个很恶心的问题,在此小记。

需求

我需要将一个对象转成成json字符串,并要求每个字段都是按照字段名升序排序。

已知

fastjson将对象转换成json的时候会将object A 的字段按照名称升序排序。

问题

object A中有个属性是一个对象 B,这个内置对象 B有一个属性是HashMap类型。
1. 我将这个A的json字符串装成object,得到object A
2. 填充object中的部分字段;
3. 将object A转成有序json
至此,问题出现:b对象中的hashMap的顺序为json串中的排列顺序。

一般来说,hashMap会对键值的排序是按照key的哈希值进行排序的。这里本人存在一个误区:认为键值的哈希值的大小顺序和键值的大小顺序是一样的。其实哈希值是的大小无法通过被哈希的值的大小来估计。

解决方法

将hashMap换成TreeMap,并实现自己的Comparator来对键值进行升序排序

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
默认情况下,map是按照(key)的严格弱序关系(strict weak ordering)进行排序的。例如,如果map是整数类型,那么它们会按照从小到大的顺序进行排序。如果map是字符串类型,那么它们会按照字典序进行排序。 如果你想要按照其他方式进行排序,可以自定义比较函数(comparator)。比较函数是一个用于比较两个元素大小的函数,它接受两个元素作为参数,并返回一个bool,表示它们的大小关系。 下面是一个例子,演示如何使用自定义比较函数对map进行排序: ```c++ #include <iostream> #include <map> #include <string> bool sortByValue(const std::pair<int, std::string>& a, const std::pair<int, std::string>& b) { return a.second < b.second; } int main() { std::map<int, std::string> myMap = {{1, "one"}, {2, "two"}, {3, "three"}, {4, "four"}, {5, "five"}}; // 使用自定义比较函数进行排序 std::vector<std::pair<int, std::string>> vec(myMap.begin(), myMap.end()); std::sort(vec.begin(), vec.end(), sortByValue); // 输出排序结果 for (auto& pair : vec) { std::cout << pair.first << " " << pair.second << std::endl; } return 0; } ``` 在这个例子中,我们定义了一个名为sortByValue的比较函数,用于按照(value)的字典序进行排序。我们将map转换为一个vector,并使用std::sort函数和自定义比较函数进行排序。最后,我们遍历排序后的vector,并输出
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值