当前位置: 首页 > 知识库问答 >
问题:

使用与值GO匹配的键对映射数组进行排序

陶征
2023-03-14

我刚开始在Golang编程,想对一系列地图进行排序。我有一系列地图。让我们称之为示例_数组。

example_array = [
  [
    { Name: "A", Value: 100 }, 
    { Name: "B", Value: 60 }, 
    { Name: "C", Value: 170 }, 
    { Name: "D", Value: 120} 
  ], 
  [
    { Name: "A", Value: 64 }, 
    { Name: "B", Value: 90 }, 
    { Name: "C", Value: 52 }, 
    { Name: "D", Value: 98} 
  ], 
  [
    { Name: "A", Value: 154 }, 
    { Name: "B", Value: 190 }, 
    { Name: "C", Value: 179 }, 
    { Name: "D", Value: 67 } 
  ]

]

现在我想使用key"C"的值对这个数组进行排序,所以example_array应该修改为-

[
[{Name: "A", Value: 64}, {Name: "B", Value: 90}, {Name: "C", Value: 52}, {Name: "D", Value: 98}],
[{Name: "A", Value: 100}, {Name: "B", Value: 60}, {Name: "C", Value: 170}, {Name: "D", Value: 120}], 
[{Name: "A", Value: 154}, {Name: "B", Value: 190}, {Name: "C", Value: 179}, {Name: "D", Value: 67}]
]

如果我使用键"D"的值对原始数组进行排序,原始数组应该修改为-

[
[{Name: "A", Value: 154}, {Name: "B", Value: 190}, {Name: "C", Value: 179}, {Name: "D", Value: 67}],
[{Name: "A", Value: 64}, {Name: "B", Value: 90}, {Name: "C", Value: 52}, {Name: "D", Value: 98}]
[{Name: "A", Value: 100}, {Name: "B", Value: 60}, {Name: "C", Value: 170}, {Name: "D", Value: 120}]
]

如何在Golang对这些地图阵列进行排序。请帮忙!

共有1个答案

司空俊悟
2023-03-14

您的数据看起来可以很容易地表示为类型为map[string]int的映射片。由于您在问题中没有提供任何Go代码,因此我无法确定数据类型,因此我将在此回答中假设它是类型为map[string]int的映射片。

对映射片进行排序的一个简单方法是使用排序。Slice函数。来自排序包留档中第一个示例中的注释:

使用排序。Slice具有自定义的Little函数,可以作为闭包提供。在这种情况下不需要任何方法

满足签名要求的函数越少

func(i, j int) bool

每包文件(接口处):

Less报告索引为i的元素是否应在索引为j的元素之前排序。

使用闭包允许您在函数体中引用数据结构,即使它不是参数列表的一部分。

下面是一个可运行的示例,它对与问题中的数据匹配的map[string]int值进行排序:

package main

import(
    "fmt"
    "sort"
)

func main() {
    in := []map[string]int{
        {
          "A": 100,
          "B": 60,
          "C": 170,
          "D": 120,
        },
        {
          "A": 64,
          "B": 90,
          "C": 52,
          "D": 98,
        },
        {
          "A": 154,
          "B": 190,
          "C": 179,
          "D": 67,
        },
    }
    for k, _ := range in[0] {
        sort.Slice(in, func(i, j int) bool { return in[i][k] < in[j][k] })
        fmt.Printf("By %s: %v\n", k, in)
    }
}

输出:

By A: [map[A:64 B:90 C:52 D:98] map[A:100 B:60 C:170 D:120] map[A:154 B:190 C:179 D:67]]
By B: [map[A:100 B:60 C:170 D:120] map[B:90 C:52 D:98 A:64] map[C:179 D:67 A:154 B:190]]
By C: [map[A:64 B:90 C:52 D:98] map[A:100 B:60 C:170 D:120] map[A:154 B:190 C:179 D:67]]
By D: [map[A:154 B:190 C:179 D:67] map[B:90 C:52 D:98 A:64] map[A:100 B:60 C:170 D:120]]
 类似资料:
  • 问题内容: 我有一个,我想找到每个值的键数 根据上面的帖子,我尝试了平面映射: 输出是 这意味着0有两个键,1有三个键,依此类推。现在,我想根据键的数量以降序对键和值进行排序。我尝试过这样的事情: 我想要以下输出: 键和值应根据此键的数量降序排列:1、2、3、4具有三个键,0和5具有两个键。 例如::1具有三个键,因此它首先出现:2和3具有三个键,而0仅具有两个键。 问题答案: 您可能具有以下内容

  • 问题内容: 在主题函数返回的代码中迭代返回的映射时,键未按顺序显示。 我如何才能使键按顺序排列/对地图进行排序,以使键按顺序排列并且值对应? 这是代码。 问题答案: 在围棋博客:去映射在行动中有极好的说明。 当使用范围循环在地图上进行迭代时,未指定迭代顺序,并且不能保证每次迭代之间都相同。从Go 1开始,运行时间会随机化映射迭代顺序,因为程序员依赖于先前实现的稳定迭代顺序。如果需要稳定的迭代顺序,

  • 问题内容: 我有一个带有几个键值对的对象数组,我需要根据’updated_at’对它们进行排序: 这样做最有效的方法是什么? 问题答案: 您可以使用。 这是一个例子:

  • 问题内容: 我有一对对。是否可以精确匹配&的值,然后检查其范围值? 示例:在doc下面是一个带有名称,值对的数组。我需要检查它是否具有键,然后检查它的值是否小于1000。 以下是我的过滤器。 我还需要检查以下内容,以便返回结果 “ client.name”必须是“ Athena” “ client.db。@ type”必须为“ Oracle”,然后继续进行以下检查 找不到“ client.db.o

  • 我希望根据记录的整数值降序排序: