如何在go lang中对map[string]接口{}类型进行多重排序? 脚本:考虑到在GO郎中有一个JSON数据要处理 现在我正在使用map[string]接口{}type使用包encoding/json,方法是执行marshal/unmarshal
以下是JSON数据:如何在go lang中对map[string]接口{}类型进行多重排序? 脚本:考虑到在GO郎中有一个JSON数据要处理 现在我正在使用map[string]接口{}type使用包encoding/json,方法是执行marshal/unmarshal,json,sorting,go,Json,Sorting,Go,以下是JSON数据: { "MysoreCity": { "Population": 1000, "VehicleCount": 1700, "Temperature": 33 }, "BangaloreCity": { "Population": 1000, "VehicleCount": 3500, "Temperature": 33 }, "KolarCi
{
"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
}
}
现在我想根据优先级执行多重排序降序,比如优先级是温度
,人口
,车辆计数
,然后我想输出如下
{
"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中排序。我是go lang的新手,在搜索我的数据排序时发现了一些东西;其中提到如下(来源:)
使用范围循环在映射上迭代时,不会指定迭代顺序,也不能保证从一次迭代到下一次迭代的顺序相同
问题:有人能解释一下如何对类似的JSON数据进行这种排序吗?我做了这个函数,从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]
}
这个答案更多的是关于解决这个问题的方法,而不是具体的解决方案。我认为这更符合你的需要,因为你还没有接近一个实际的解决方案。以下是简单的程序步骤 1) 为它定义一个类型,从这里开始我将称之为
City
"TumkurCity": {
"Population": 800,
"VehicleCount": 300,
"Temperature": 29
}
type City struct {
Population int
VehicleCount int
Temperature int
Name string
}
2) 解组为地图[字符串]城市
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) 定义一些方法来对城市进行任意排序
我在浏览器中编写了代码,所以它没有经过测试。它应该提供一个如何处理它的充分例子。当您解组时,您的城市类型将没有名称值,因此您可以稍后为其分配键(城市名称)。将它们放入一个切片或数组中,对其进行排序。如果您按照这些步骤操作,就相当简单。地图不维护秩序,您无法对地图进行排序。从JSON解组后,从元素中创建一个片段,您可以根据需要对片段进行排序。看看这个包,除了@icza所说的,JSON对象是一组无序的名称/值对。如果您想要排序,您需要一个对象数组。首先,将
map[string]interface{}
转换为类似[]struct{Name string;Pop int,VC int,Temp int}
的合理格式。然后将sort.Interface
方法附加到结构类型,并使用sort.sort
进行排序。有时编程有帮助:-)