【问题标题】:how to delete Duplicate elements between slices on golang如何删除golang切片之间的重复元素
【发布时间】:2018-11-07 16:44:47
【问题描述】:

例子:

a_array := {"1","2","3","4,"}
b_array := {"3","4"}

想要的结果:

"1","2"

假设,a_array 元素肯定有b_array 元素。

【问题讨论】:

标签: go


【解决方案1】:

如果您需要严格比较一个切片与另一个切片,您可以按照以下方式做一些事情

func diff(a []string, b []string) []string {
    // Turn b into a map
    var m map[string]bool
    m = make(map[string]bool, len(b))
    for _, s := range b {
        m[s] = false
    }
    // Append values from the longest slice that don't exist in the map
    var diff []string
    for _, s := range a {
        if _, ok := m[s]; !ok {
            diff = append(diff, s)
            continue
        }
        m[s] = true
    }
    // Sort the resulting slice
    sort.Strings(diff)
    return diff
}

Go Playground


或者,如果您想从两个切片中获取两个切片中都不存在的所有值,您可以这样做

func diff(a []string, b []string) []string {
    var shortest, longest *[]string
    if len(a) < len(b) {
        shortest = &a
        longest = &b
    } else {
        shortest = &b
        longest = &a
    }
    // Turn the shortest slice into a map
    var m map[string]bool
    m = make(map[string]bool, len(*shortest))
    for _, s := range *shortest {
        m[s] = false
    }
    // Append values from the longest slice that don't exist in the map
    var diff []string
    for _, s := range *longest {
        if _, ok := m[s]; !ok {
            diff = append(diff, s)
            continue
        }
        m[s] = true
    }
    // Append values from map that were not in the longest slice
    for s, ok := range m {
        if ok {
            continue
        }
        diff = append(diff, s)
    }
    // Sort the resulting slice
    sort.Strings(diff)
    return diff
}

然后

fmt.Println(diff(a_array, b_array))

会给你

[1 2]

Go playground

【讨论】:

  • Dif 不能基于最长或最小尺寸的集合来完成。这意味着,假设A[] = {1, 2}B[] = {1, 2, 3, 4} 并且如果他想要A dif BA\B 或'A - B' 在集合方面),那么你的程序只给出输出{3, 4},其中正确答案是@ 987654331@。希望是有道理的。
  • 首先建议的实现不是基于最短或最小的,它只是一个稍微不同的问题的实现细节——从两个切片中获取不存在于它们中的值,或者换句话说消除两者中存在的所有内容,并再次从两个切片中为我提供其余的唯一值。从 OP 的问题中,不清楚究竟需要什么 - 减去两个切片假装它们是集合或我的解释的结果。但我将添加另一个版本,将ab 进行严格比较。
猜你喜欢
  • 1970-01-01
  • 2016-03-10
  • 2016-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-15
  • 2014-09-27
  • 2013-12-15
相关资源
最近更新 更多