如何在go lang中对map [string] interface {}进行多重排序?

时间:2015-04-09 10:44:29

标签: json sorting go

场景:考虑我要在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
    }
}

现在我想根据优先级执行多降序排序,优先级为TemperaturePopulationVehicleCount然后我希望输出像

{
    "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数据进行此类排序?

2 个答案:

答案 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]
  }