栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在Go Slice或数组中查找唯一项

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在Go Slice或数组中查找唯一项

您的代码中存在多个错误。最严重的是,由于您要将

visited
切片的每个特定元素与的 所有
元素进行比较
unique
,因此如果
unique
包含至少一个不同的元素,最终将附加它。而且,如果由于
unique
内部
for
循环不会“中断”
而有更多不同的元素,您将最终多次追加它。这是不是你想要的,你要追加相等于元素 没有
unique


还要注意,

struct
如果Go中的每个字段都是可比较的,则a
in可比较。由于您的
visit
结构仅包含2个
int
字段,因此具有可比性,因此您可以
visit
简单地将type的值与
==
运算符进行比较,而不必太丑陋
reflect.DeepEqual()
。请参见规格:比较运算符:

如果结构的所有字段都是可比较的,则它们的值是可比较的。如果两个结构值对应的非空白字段相等,则它们相等。

这是适用您逻辑的简化正确版本:

visited := []visit{    visit{1, 100},    visit{2, 2},    visit{1, 100},    visit{1, 1},}var unique []visitfor _, v := range visited {    skip := false    for _, u := range unique {        if v == u { skip = true break        }    }    if !skip {        unique = append(unique, v)    }}fmt.Println(unique)

输出(在Go Playground上尝试):

[{1 100} {2 2} {1 1}]

另类

确实,Go没有内置的集合类型,但是您可以

map[visit]bool
轻松地将其用作集合。这样,它变得非常简单!请注意,
visit
由于它具有可比性,因此可以用作地图中的键(请参见上文)。

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)

输出(在Go Playground上尝试):

map[{2 2}:true {1 1}:true {1 100}:true]

唯一的“列表”是地图中键的列表。

如果要将唯一

visit
值用作切片,请参见以下变体:

var unique []visitm := map[visit]bool{}for _, v := range visited {    if !m[v] {        m[v] = true        unique = append(unique, v)    }}fmt.Println(unique)

输出(如预期的那样,在Go Playground上尝试):

[{1 100} {2 2} {1 1}]

请注意,此索引表达式:

m[v]
计算
true
是否
v
在地图中(作为键,
true
是我们存储在地图中的值)。如果
v
还没有在地图上,
m[v]
得出这是值类型的零值
false
的类型
bool
,正确地告诉该值
v
还没有在地图上。请参见规格:索引表达式:

对于地图类型

M

…如果地图

nil
包含或不包含此类条目,
a[x]
则是的值类型的零值
M



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/401473.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号