【问题标题】:How to categorize list of objects based on a parameter如何根据参数对对象列表进行分类
【发布时间】:2020-05-01 04:49:48
【问题描述】:

我有一个具有此定义的对象列表:

type MyObject struct {
    ID        int `json:"id"`
    Level     int `json:"level"`
    CityID    int `json:"city_id"`
}

我想根据CityID 对它们进行分类,以便获得一个列表列表,其中每个内部列表的项目都具有相同的CityID

例如,如果我有以下列表:

[
    MyObject {ID: 1, Level: 12, CityID: 7},
    MyObject {ID: 2, Level: 15, CityID: 2},
    MyObject {ID: 3, Level: 55, CityID: 4},
    MyObject {ID: 4, Level: 88, CityID: 7},
    MyObject {ID: 5, Level: 11, CityID: 4},
    MyObject {ID: 6, Level: 5, CityID: 7},
    MyObject {ID: 7, Level: 42, CityID: 2}
]

我需要以下输出:

[
    [MyObject {ID: 1, Level: 12, CityID: 7}, MyObject {ID: 4, Level: 88, CityID: 7}, MyObject {ID: 6, Level: 5, CityID: 7}],
    [MyObject {ID: 2, Level: 15, CityID: 2}, MyObject {ID: 7, Level: 42, CityID: 2}],
    [MyObject {ID: 3, Level: 55, CityID: 4}, MyObject {ID: 5, Level: 11, CityID: 4}]
]

我知道在 python 中使用itertools 是可能的,但我是go 的新手,对它的库知之甚少。有什么帮助吗?

编辑 1:

我目前正在使用这个:

m := make(map[int][]MyObject)

for _, item := range myList {
    if val, ok := m[item.CityID]; ok {
        m[item.CityID] = append(val, item)
    } else {
        m[item.CityID] = []MyObject{item, }
    }
}

【问题讨论】:

  • Go 没有魔法,你必须使用循环来迭代你的对象,并将它们收集到一个映射(切片)中,映射自 CitiID
  • 如果您分享一些您尝试过的代码 - 这将有助于引导您朝着正确的方向前进。
  • @icza,我目前正在使用您建议的方法。
  • @favoretti,请查看我对该问题的编辑。
  • 那么什么不起作用呢?对我来说似乎是一个不错的解决方案:)

标签: arrays dictionary go categories slice


【解决方案1】:

您当前的方法是要走的路,但它可能会被简化,无需检查 CityID 是否已经在地图中,因为 indexing 的地图中没有键将产生值类型的zero value,对于切片是nil,您可以毫无问题地附加到nil 切片:

m := make(map[int][]MyObject)

for _, item := range myList {
    m[item.CityID] = append(m[item.CityID], item)
}

【讨论】:

    【解决方案2】:

    为您完成计划

    这可能会很长,但工作正常,如果您没有任何其他选择可能会有所帮助。

     package main
    
    // only needed below for sample processing
    
    type MyObject struct {
        ID        int `json:"id"`
        Level     int `json:"level"`
        CityID    int `json:"city_id"`
    }
    
    var listOfID = make([]int, 0)
    
    func main() {
        var listMap = make(map[int][]MyObject)
    
        obj :=  MyObject {ID: 1, Level: 12, CityID: 7}
    
        for i := 0; i < 10; i++ {
            listMap = addToList(obj, listMap)
        }
    
        obj1 := MyObject {ID: 1, Level: 12, CityID: 8}
    
        for i := 0; i < 10; i++ {
            listMap = addToList(obj1, listMap)
        }
    
        listOfList := getListOfLists(listMap)
    
        printListOfList(listOfList)
    }
    
    func printListOfList(list interface{}) {
        // print here
        return
    }
    
    func getListOfLists(listMap map[int][]MyObject) interface{} {
        var listOfLists [][]MyObject
        for i:=0; i < len(listOfID); i++ {
            innerList := listMap[listOfID[i]]
            listOfLists = append(listOfLists, innerList)
        }
        return listOfLists
    }
    
    func addToList(obj MyObject, listMap map[int][]MyObject) map[int][]MyObject {
        cityID := obj.CityID
        list := listMap[cityID]
    
        if list != nil {
            list = append(list, obj)
            listMap[cityID] = list
        } else {
            var newList []MyObject
            listOfID = append(listOfID, cityID)
            newList = make([]MyObject, 0)
            newList = append(newList, obj)
            listMap[cityID] = newList
        }
    
        return listMap
    }
    

    【讨论】:

      猜你喜欢
      • 2015-01-03
      • 2018-07-18
      • 2018-05-23
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      • 2016-09-28
      • 1970-01-01
      相关资源
      最近更新 更多