按键+合并数组值分组

时间:2016-10-15 22:23:10

标签: go

我正在尝试将多个数组的数组值与相同的键合并(按+组合排序)。 Go中是否有任何原生方式来转换此输入:

input = [
    [
        { a: 1, b: [1,2]},
        { a: 2, b: [1,2]},
        { a: 3, b: [1,2]}
    ],
    [
        { a: 1, b: [3,4]},
        { a: 2, b: [3,4]},
        { a: 3, b: [3,4]},
        { a: 4, b: [3,4]}
    ],
    [
        { a:1, b: [5,6]},
        { a:2, b: [5,6]},
        { a:3, b: [5,6]},
        { a:4, b: [5,6]},
        { a:5, b: [5,6]}
    ]
 ]

成:

output = [
    { a: 1, b: [1,2,3,4,5,6]},
    { a: 2, b: [1,2,3,4,5,6]},
    { a: 3, b: [1,2,3,4,5,6]},
    { a: 4, b: [3,4, 5,6]},
    { a: 5, b: [5,6]},
]

1 个答案:

答案 0 :(得分:9)

你的代码不是Go代码(它会以Ruby身份传递),而且没有明确的尝试来实际解决问题,这可能是你得到一些downvotes而没有答案的原因。

一种方法是将你的代码解释为Ruby,用input一片切片的地图(字符串,也许,虽然Ruby会将它们视为符号)将其键入任意一个(在这种情况下) a)或一些整数(在b的情况下)。您可以使用空接口(interface{})对地图值执行此操作,但使用这样的结构会更直接:

type ab struct {
    a int
    b []int
}

input[][]ab。但只要我们重新调整您的数据以更好地适应语言,就可以更加直接地完全取消ab,用a的地图替换该结构值是键,b值是值。事情就是迭代input并将切片附加到output的简单问题:

package main

import "fmt"

func main() {
    input := []map[int][]int{
        {
            1: []int{1, 2},
            2: []int{1, 2},
            3: []int{1, 2},
        },
        {
            1: []int{3, 4},
            2: []int{3, 4},
            3: []int{3, 4},
            4: []int{3, 4},
        },
        {
            1: []int{5, 6},
            2: []int{5, 6},
            3: []int{5, 6},
            4: []int{5, 6},
            5: []int{5, 6},
        },
    }

    output := make(map[int][]int)

    for _, m := range input {
        for k, v := range m {
            output[k] = append(output[k], v...)
        }
    }

    fmt.Println(output)
}

这会产生输出:

map[1:[1 2 3 4 5 6] 2:[1 2 3 4 5 6] 3:[1 2 3 4 5 6] 4:[3 4 5 6] 5:[5 6]]
因此,

output可以根据需要组织数据,并提供表示数据组织的修改方式。