1. ホーム
  2. for-loop

[解決済み] for-loopの中で一意性を確認するには?

2023-02-12 20:31:17

質問

スライス/マップに値があるかどうかをチェックする方法はありますか?

私はスライスに値を追加したいのですが だけ とすれば ではない がスライスの中に存在します。

これは動作しますが、冗長な印象を受けます。もっと良い方法はないでしょうか?

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]

どのように解決するのですか?

あなたのアプローチは、各挿入に線形時間がかかるでしょう。よりよい方法としては map[int]struct{} . あるいは map[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")
}