如何根据参数对对象列表进行分类
How to categorize list of objects based on a parameter
我有一个具有此定义的对象列表:
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, }
}
}
你现在的方法是要走的路,但它可能会被简化,不需要检查地图中是否已经存在 CityID
,因为值类型的 indexing a map with a key that isn't in it will result in the zero value,这是 nil
切片,您可以毫无问题地附加到 nil
切片:
m := make(map[int][]MyObject)
for _, item := range myList {
m[item.CityID] = append(m[item.CityID], item)
}
为您完成程序
它可能很长但工作正常,如果您没有任何其他选择可能会有所帮助。
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
}
我有一个具有此定义的对象列表:
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, }
}
}
你现在的方法是要走的路,但它可能会被简化,不需要检查地图中是否已经存在 CityID
,因为值类型的 indexing a map with a key that isn't in it will result in the zero value,这是 nil
切片,您可以毫无问题地附加到 nil
切片:
m := make(map[int][]MyObject)
for _, item := range myList {
m[item.CityID] = append(m[item.CityID], item)
}
为您完成程序
它可能很长但工作正常,如果您没有任何其他选择可能会有所帮助。
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
}