如何在go lang中对map[string]接口{}类型进行多重排序? 脚本:考虑到在GO郎中有一个JSON数据要处理 现在我正在使用map[string]接口{}type使用包encoding/json,方法是执行marshal/unmarshal

如何在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

以下是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
    }
}
现在我想根据优先级执行多重排序降序,比如优先级是
温度
人口
车辆计数
,然后我想输出如下

{
    "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
进行排序。有时编程有帮助:-)