一尘不染

如何检查for循环内的唯一性?

javascript

有没有办法检查切片/地图是否存在值?

当切片中存在值时,我才想向切片添加值。

这有效,但似乎冗长。有一个更好的方法吗?

orgSlice := []int{1, 2, 3}
newSlice := []int{}
newInt := 2

newSlice = append(newSlice, newInt)
for _, v := range orgSlice {
    if v != newInt {
        newSlice = append(newSlice, v)
    }
}

newSlice == [2 1 3]

阅读 258

收藏
2021-12-08

共1个答案

一尘不染

您的方法每次插入都需要线性时间。更好的方法是使用map[int]struct{}. 或者,您也可以使用 amap[int]bool或类似的东西,但空struct{}的优点是它不占用任何额外的空间。因此map[int]struct{}是一组整数的流行选择。

例子:

set := make(map[int]struct{})
set[1] = struct{}{}
set[2] = struct{}{}
set[1] = struct{}{}
// ...

for key := range(set) {
  fmt.Println(key)
}
// each value will be printed only once, in no particular order


// you can use the ,ok idiom to check for existing keys
if _, ok := set[1]; ok {
  fmt.Println("element found")
} else {
  fmt.Println("element not found")
}
2021-12-08