ホームページ >バックエンド開発 >Golang >golangでsetを実装する方法

golangでsetを実装する方法

PHPz
PHPzオリジナル
2023-04-14 09:16:371065ブラウズ

Golang は、静的型付け、同時実行性の高いオブジェクト指向プログラミング言語であり、近年ますます人気が高まっている言語の 1 つでもあります。 Golang には Set 型はありませんが、スライスやマップなどの基本的なデータ構造によって簡単に Set の機能を実装できます。この記事ではGolangでSetを実装する方法を紹介します。

Set の定義

Set は順序付けされておらず、繰り返しのないデータ構造であり、要素の追加、要素の削除、要素が存在するかどうかの判断など、セットの基本操作をサポートします。 Set では、要素間に順序関係はなく、各要素は一意です。

Slice は Set を実装します

Golang の Slice は Set の機能を実装できます。これは、Slice 内の要素が順序付けされており、各要素が繰り返し現れることができるためです。 Set の目的を達成するために、カスタム メソッドを通じて Slice の重複排除操作を実装できます。

type SetSlice []interface{}

func (s *SetSlice) Add(val interface{}) {
    for _, v := range *s {
        if val == v {
            return
        }
    }
    *s = append(*s, val)
}

func (s *SetSlice) Remove(val interface{}) {
    for i, v := range *s {
        if val == v {
            *s = append((*s)[:i], (*s)[i+1:]...)
            return
        }
    }
}

func (s *SetSlice) Contains(val interface{}) bool {
    for _, v := range *s {
        if val == v {
            return true
        }
    }
    return false
}

上記のコードでは、SetSlice タイプをカスタマイズし、Add、Remove、Contains などのメソッドを追加しました。 Add メソッドを呼び出すときは、まずスライスを走査して同じ要素が存在するかどうかを確認し、存在する場合は直接戻ります。存在しない場合は、要素をスライスに追加します。要素を削除する場合は、スライスを走査して、削除する要素を見つけます。削除され、削除操作が実行されます。要素が存在するかどうかを判断するときは、スライスを走査して要素を見つけます。

Map は Set を実装します

Slice に加えて、Golang の Map は Set の機能も実装できます。これは、Map 内の各キーが一意である必要があるためです。 Map のキーを要素の値として使用し、Map の値を任意の値に設定できます。特定の値は気にせず、要素が Map に表示されるかどうかを判断するだけで済みます。

type SetMap map[interface{}]struct{}

var exist = struct{}{}

func (s SetMap) Add(val interface{}) {
    s[val] = exist
}

func (s SetMap) Remove(val interface{}) {
    delete(s, val)
}

func (s SetMap) Contains(val interface{}) bool {
    _, c := s[val]
    return c
}

上記のコードでは、SetMap タイプをカスタマイズし、Add、Remove、Contains などのメソッドを追加しました。 Add メソッドを呼び出すときは、要素を Map のキーとして Map に直接挿入し、値は空の struct{} 型です。要素を削除するときは、delete 関数を使用して Map 内の対応するキーを直接削除します。 ; 要素が存在するかどうかを判断するときは、Map 内の対応するキーにアクセスすることで要素が存在するかどうかを判断します。

まとめ

Golang には Set 型はありませんが、スライスやマップなどの基本的なデータ構造によって Set の機能を実現できます。スライスを使用して Set を実装するには手動の重複排除が必要ですが、これはさらに面倒ですが、マップを使用して Set を実装する方が簡単で効率的です。もちろん、交差や結合など、Set に対してより複雑な操作を実行する必要がある場合は、効率を大幅に向上できる github.com/deckarep/golang-set などのサードパーティ ライブラリを使用することをお勧めします。

以上がgolangでsetを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。