场景:考虑我要在go lang中处理JSON数据
现在我通过map[string]interface{}
encoding/json
来使用marshal/unmarshal
类型
以下是JSON数据:
{
"MysoreCity": {
"Population": 1000,
"VehicleCount": 1700,
"Temperature": 33
},
"BangaloreCity": {
"Population": 1000,
"VehicleCount": 3500,
"Temperature": 33
},
"KolarCity": {
"Population": 1250,
"VehicleCount": 3500,
"Temperature": 31
},
"TumkurCity": {
"Population": 800,
"VehicleCount": 300,
"Temperature": 29
}
}
现在我想根据优先级执行多降序排序,优先级为Temperature
,Population
,VehicleCount
然后我希望输出像
{
"BangaloreCity": {
"Population": 1000,
"VehicleCount": 3500,
"Temperature": 33
},
"MysoreCity": {
"Population": 1000,
"VehicleCount": 1700,
"Temperature": 33
},
"KolarCity": {
"Population": 1250,
"VehicleCount": 3500,
"Temperature": 31
},
"TumkurCity": {
"Population": 800,
"VehicleCount": 300,
"Temperature": 29
}
}
所以关于一些动态优先级的排序。
问题:我没有得到任何线索如何在go lang中对它进行排序。我是新手,在搜索排序数据时发现了一些东西;如下所述(来源:link)
在使用范围循环迭代地图时,未指定迭代顺序,并且不保证从一次迭代到下一次迭代都是相同的。
问题:有没有人能说明如何使用类似的JSON数据进行此类排序?
答案 0 :(得分:1)
这个答案更多地是关于解决这个问题的方法,而不是特定的解决方案。我认为此时你需要的更多,因为你并不接近实际的解决方案。以下是简单的程序步骤;
1)为此定义一个类型,我将从此处将其称为City
;
"TumkurCity": {
"Population": 800,
"VehicleCount": 300,
"Temperature": 29
}
type City struct {
Population int
VehicleCount int
Temperature int
Name string
}
2)解组为map[string]City
3)使用这样的方法来转换数据;
func ToSlice(m map[string]City) []City {
cities := make([]City, 0, len(m))
for k, v := range m {
v.Name = k
cities = append(cities, v)
}
return cities
}
4)定义一些方法来排序城市,但是你想要
我在浏览器中编写了该代码,因此尚未经过测试或其他任何内容。它应该提供一个如何处理它的充分示例。解组您的城市类型时,没有名称的值,因此您可以稍后将密钥(城市名称)分配给该名称。把它们放在切片或数组中,然后对它进行排序。如果你按照这些步骤,这很简单。
答案 1 :(得分:0)
我做了这个函数从N个映射及其排序的键中获取结果映射。
func getSortedKeys(maps ...map[string]string) (map[string]string, []string) {
var keys []string
resultMap := map[string]string{}
for _, currMap := range maps {
for k, v := range currMap {
resultMap[k] = v
keys = append(keys, k)
}
}
sort.Strings(keys)
return resultMap, keys
}
在你可以做的功能之外:
concatenedMaps, keys := getSortedKeys(map1,map2)
for _, k := range keys {
value := concatenedMaps[k]
}