首页 >后端开发 >Golang >如何在 Go 切片或数组中查找唯一元素?

如何在 Go 切片或数组中查找唯一元素?

Susan Sarandon
Susan Sarandon原创
2024-11-02 11:02:30427浏览

How to Find Unique Elements in a Go Slice or Array?

在 Go 切片或数组中查找唯一项

在 Go 中处理数据时,可能需要仅提取唯一元素来自切片或数组。虽然 Python 为此提供了方便的构造(例如集合),但 Go 本身并不提供类似的内置功能。

考虑问题中提供的示例代码,其目的是从列表中查找唯一坐标包含重复项。该代码尝试通过迭代原始列表(已访问)和最初为空的唯一列表,使用反射将访问中的每个元素与唯一的所有元素进行比较来实现此目的。

代码分析和错误

但是,代码包含几个问题:

    使用反射(reflect.DeepEqual())进行元素比较是不必要的,并且会带来额外的复杂性。
  • 内循环盲目追加元素,不考虑元素是否已经存在于unique中,导致同一元素多次添加。

改进方案

下面介绍了一种遵循所需逻辑的简化且更高效的解决方案:

<code class="go">visited := []visit{
    visit{1, 100},
    visit{2, 2},
    visit{1, 100},
    visit{1, 1},
}
var unique []visit

for _, v := range visited {
    skip := false
    for _, u := range unique {
        if v == u {
            skip = true
            break
        }
    }
    if !skip {
        unique = append(unique, v)
    }
}

fmt.Println(unique)</code>

使用 Map 的替代解决方案

或者,可以利用 Go 的 map[访问] bool 创建类似集合的结构并提取唯一元素,如下所示:

<code class="go">visited := []visit{
    visit{1, 100},
    visit{2, 2},
    visit{1, 100},
    visit{1, 1},
}
unique := map[visit]bool{}

for _, v := range visited {
    unique[v] = true
}

fmt.Println(unique)</code>
映射键代表唯一元素。要获得唯一访问值的切片,需要一个额外的步骤:

<code class="go">visited := []visit{
    visit{1, 100},
    visit{2, 2},
    visit{1, 100},
    visit{1, 1},
}
var unique []visit

m := map[visit]bool{}

for _, v := range visited {
    if !m[v] {
        m[v] = true
        unique = append(unique, v)
    }
}

fmt.Println(unique)</code>
这些解决方案有效地找到 Go 切片或数组中的唯一元素,遵循问题陈述并在构建时提供有效的替代方案 -缺少设置功能。

以上是如何在 Go 切片或数组中查找唯一元素?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn