2017-04-06 19 views
1

如果你有一個集合型斯威夫特(如Set<T>),那麼你可以刪除一組喜歡的東西......FUNC移除(元) - > [T] {}在集合中迅速

var s = // some set 
s.remove(someElement) 

它會改變s並從中刪除someElement

但是,這是一個變異函數。

是否有一個非變異函數會返回一個新集?像...

let smallerSet = largerSet.removing(someElement) 

我可以用filter但後來事實證明這從O(1)O(n)時間問題。

如果沒有人可以自己寫一個。是否有這樣的非變異函數名稱的約定?

+4

它總是會爲O(n),因爲你要複製的集... – kennytm

+1

威爾的NSMutableSet幫助https://developer.apple.com/reference/foundation/nsmutableset?我已經看到了混合的結果,專門用於添加/搜索,但刪除速度更快。不確定你的用例,但值得一讀。 –

+0

@kennytm啊是的,這是一個很好的觀點。我沒有想到這一點。謝謝 – Fogmeister

回答

3

您可以使用減去設置的功能。爲此,您需要將該元素在另一個Set中刪除。

let elementToBeDeleted = Set(arrayLiteral: 1) 
var wholeSet = Set(arrayLiteral: 1,2,3) 
wholeSet = wholeSet.subtracting(element) 
print(wholeSet) //This would print [2,3]. 

希望這是你需要做的事情。

+1

謝謝,這絕對是最接近我一直在尋找和它的「開箱即用」過。 :d – Fogmeister

+3

沒有必要使用'初始化(xyzLiteral:)'initialisers - 他們正在使用的編譯器,當你使用一個文字,例如'VAR wholeSet:設置= [1,2,3]'&'wholeSet .subtracting([1])'。 – Hamish

+0

@Fogmeister很高興幫助你。 –