从两个切片的重复项创建切片

时间:2018-06-28 08:33:26

标签: arrays go slice

我有两片:

slice1 := []string{"a", "b", "c", "d"}
slice2 := []string{"c", "d", "e", "f"}

预期结果:

[]string{"c", "d"}

从具有以下规范的slice1slice2的重复项中创建切片的最佳方法是什么:

  1. 最小代码
  2. 切片很大
  3. 切片未排序
  4. 请勿修改切片
  5. 它们可能不包含重复项

这是我尝试过的:

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]

1 个答案:

答案 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{}使用了零字节的内存