Go言語で集合演算処理を実装しよう!

こんにちは。KOUKIです。

Go言語で集合演算処理のプログラムを作ってみましょう!

ワークスペースの作成

ワークスペースを作成しましょう。

積集合

説明

一つのList(円)を集合と定義します。
積集合は、2つのListが重なり合った集合のことを指します。

実装

積集合の関数を作成します。

上記のコードでは、引数にint型のListを渡しています。このListが集合です。

このプログラムが正しく動けば、l1とl2が重なっている値を抜き出せるはずです。

テスト

テストコードを書いて、確認してみましょう。

List1を「1, 2, 3, 4, 5」、List2を「3, 4, 5, 6, 7」の集合にしたので、結果は「3, 4, 5」になるはずです。

和集合

説明

和集合は、2つのListの集合に対して少なくともどちらか一方の集合に属する要素全体の集合のことを指します。要するに全部ということですが、重複値は許しません。

実装

List1とList2をmapに変換して、rangeで取り出します。

テスト

テストコードを実装します。

List1を「1, 2, 3, 4, 5」、List2を「3, 4, 5, 6, 7」の集合にしたので、結果は「1, 2, 3, 4, 5, 6, 7」になるはずです。

実行してみましょう。

スライスは順番を保持しないのでテストが失敗する場合もありますが、出力にある「Result: [1 2 3 4 5 6 7]」を確認してください。

差集合

説明

差集合は、List1 に含まれているがList2 には含まれていない要素の集合のことです。

実装

和集合と似た感じで実装してみます。

l1パラメータに、差分を出したい方のListを指定します。

テスト

テストコードを実装しましょう。

List1を「1, 2, 3, 4, 5」、List2を「3, 4, 5, 6, 7」の集合にしたので、結果は「1, 2」になるはずです。

対称差集合

説明

対称差集合とは 2 つのListのどちらか片方だけに含まれる要素の集合のことです。

実装

これも和集合と似た感じで実装してみます。

うーん。なんかもっと効率の良い書き方があるかもしれないですね。

テスト

テストコードを実装しましょう。

List1を「1, 2, 3, 4, 5」、List2を「3, 4, 5, 6, 7」の集合にしたので、結果は「1, 2, 6, 7」になるはずです。

補足: プログラムを早くする工夫

sliceやmapを定義するとき、makeでCapacityを指定しています。

こうすると、プログラムが結構早くなるのでおすすめです。

おわりに

もしかしたら、集合演算用のライブラリがあるのかも知れませんが、今回は手組みで実装してみました。

ライブラリはとても便利なのですが、使いすぎると自分でロジックを構築する力が衰えてきますよね^^;

たまには、こーいうのも良いです^^

それでは、また!

Go記事まとめ

ソースコード

コメントを残す