SwiftのSetで集合演算

SwiftのSetで集合演算

みなさんこんにちは

最近RubyistからiOSエンジニアに転向した気がするので詳解Swift第3版を読みながら勉強しています。
今回は私がたまに使うことのあるSetについていろいろ試してみました。
これは毎回調べながら使っているのでどんなメソッドがあるのかすぐに忘れます。

検証環境

  • Swift 3.0.2

Setというのはコレクションの1種で、配列よりはDictionaryに近いものですが、同じ型同士であれば和集合や差集合などの集合演算が行えるようです。
集合はベン図で説明されるおなじみのあれです。

和集合(union)

例えば以下のように、私のお気に入り言語の集合「myFavoriteLanguage」と、サトシのお気に入り言語の集合
「satoshiFavoriteLanguage」があった場合に、unionを使うと和集合を求めることができます。

import UIKit

var myFavoriteLanguage: Set<String> = ["Ruby", "Swift", "Objective-C"]
let satoshiFavoriteLanguage = ["PHP", "JavaScript", "Swift"]
let union = myFavoriteLanguage.union(satoshiFavoriteLanguage)

print(union)

結果

"["JavaScript", "Ruby", "Objective-C", "PHP", "Swift"]\n"

これにより、unionの中身は[“JavaScript”, “Ruby”, “Objective-C”, “PHP”, “Swift”]となり、それぞれの変数の中身が合わさって私の嫌いな言語でサトシの好きな言語であるPHPが入りました。

自身を変更したい場合は破壊的なmyFavoriteLanguage.formUnion(satoshiFavoriteLanguage)を使います。

差集合(substracting)

私のお気に入り言語とサトシのお気に入り言語の差分を知りたい場合は以下のようにします。

import UIKit

var myFavoriteLanguage: Set<String> = ["Ruby", "Swift", "Objective-C"]
let satoshiFavoriteLanguage = ["PHP", "JavaScript", "Swift"]
let sub = myFavoriteLanguage.subtracting(satoshiFavoriteLanguage)

print(sub)

結果

"["Ruby", "Objective-C"]\n"

subの中身は、サトシと私が共通でお気に入りのSwift以外の差分となりました。

自身を変更したい場合は破壊的なmyFavoriteLanguage.subtract(satoshiFavoriteLanguage)を使います。

積集合(intersection)

サトシとのお気に入り言語で一致するものだけを知りたい場合は以下のようにします。

import UIKit

var myFavoriteLanguage: Set<String> = ["Ruby", "Swift", "Objective-C"]
let satoshiFavoriteLanguage = ["PHP", "JavaScript", "Swift"]
let sub = myFavoriteLanguage.intersection(satoshiFavoriteLanguage)

print(sub)

結果

"["Swift"]\n"

Swiftがお気に入りというところはサトシと話が合いそうです。

自身を変更したい場合は破壊的なmyFavoriteLanguage.formIntersection(satoshiFavoriteLanguage)を使います。

対象差集合(symmetricDifference)

対象差集合といわれてよくわからなかったのですが、要するにXOR(排他的論理和)を知りたい場合は以下のようにします。

import UIKit

var myFavoriteLanguage: Set<String> = ["Ruby", "Swift", "Objective-C"]
let satoshiFavoriteLanguage = ["PHP", "JavaScript", "Swift"]
let sdiff = myFavoriteLanguage.symmetricDifference(satoshiFavoriteLanguage)

print(sdiff)

結果

"["PHP", "Ruby", "Objective-C", "JavaScript"]\n"

私のお気に入り言語とサトシのお気に入り言語をあわせたものから重複したものを除いたものになりました。(何言っているかよくわからない)

自身を変更したい場合は破壊的なmyFavoriteLanguage.symmetricDifference(satoshiFavoriteLanguage)を使います。

次回は、ビット列でフラグを管理する代わりに使えるOptionSetを試してみたいと思います。

TAG

  • このエントリーをはてなブックマークに追加
金子 将範
エンジニア 金子 将範 rubyist

新しいことや難しい課題に挑戦することにやりがいを感じ、安定やぬるい事は退屈だと感じます。 考えるより先に手が動く、肉体派エンジニアで座右の銘は諸行無常。 大事なのは感性、プログラミングにおいても感覚で理解し、感覚で書きます。