我有两片:
slice1 := []string{"a", "b", "c", "d"}
slice2 := []string{"c", "d", "e", "f"}
预期结果:
[]string{"c", "d"}
从具有以下规范的slice1
和slice2
的重复项中创建切片的最佳方法是什么:
这是我尝试过的:
slice1 := []string{"a", "b", "c", "d"}
slice2 := []string{"c", "d", "e", "f"}
duplicateItems := []string{}
for _, item1 := range slice1 {
for _, item2 := range slice2 {
if item1 == item2 {
duplicateItems = append(duplicateItems, item1)
}
}
}
fmt.Println(duplicateItems) // [c d]
答案 0 :(得分:6)
此方法会牺牲内存使用量,以提高O的复杂性(速度)。
// flatten the first slice into a map for O(1) constant time lookup
m1 := make(map[string]struct{})
for _, v := range slice1 {
m1[v] = struct{}{}
}
var dup []string
// iterate slice 2, using the O(1) lookup.
for _, v := range slice2 {
if _, exists := m1[v]; exists {
dup = append(dup, v)
}
}
// dup contains the duplicates
每个元素只能访问一次,但是内存需求要大得多,因为slice1需要存储在地图中。
您可以扩展此代码以将2个切片中的最小切片展平到映射中,以减少内存需求。
值得注意的是,使用map[string]struct{}
代替了map[string]bool
,因为struct{}
使用了零字节的内存