基本的に私はのバージョンが必要ですが、これにはの重複要素が付加されていません。2つの配列を迅速にマージし、重複を取り除く簡単な方法はありますか?
例
var a = [1, 2, 3]
let b = [3, 4, 5]
a.mergeElements(b)
//gives a = [1, 2, 3, 4, 5] //order does not matter
基本的に私はのバージョンが必要ですが、これにはの重複要素が付加されていません。2つの配列を迅速にマージし、重複を取り除く簡単な方法はありますか?
例
var a = [1, 2, 3]
let b = [3, 4, 5]
a.mergeElements(b)
//gives a = [1, 2, 3, 4, 5] //order does not matter
アレイの拡張機能は、これを実行するために作成することができます。
extension Array where Element : Equatable{
public mutating func mergeElements<C : CollectionType where C.Generator.Element == Element>(newElements: C){
let filteredList = newElements.filter({!self.contains($0)})
self.appendContentsOf(filteredList)
}
}
もちろん、Equatable
要素にのみ有効です。
は、単に:
let unique = Array(Set(a + b))
これは、一般的に使用スウィフトに可能であるunion、呼ばれSet
:
let a = [1, 2, 3]
let b = [3, 4, 5]
let set = Set(a)
let union = set.union(b)
あなただけの配列にセットを変換することができます:
let result = Array(union)
アイディアははっきりしていますが、例はコンパイルされません。また、 'union' *は新しいセットを返し、受信者は変更しません。 –
@MartinRああ、あなたは正しいです。それは私がクイックコピー/ペーストのために得たもので、修正されました。 – Bryan
スウィフト3.0受け入れられた回答のバージョン。
extension Array where Element : Equatable{
public mutating func mergeElements<C : Collection>(newElements: C) where C.Generator.Element == Element{
let filteredList = newElements.filter({!self.contains($0)})
self.append(contentsOf: filteredList)
}
}
注:価値関数に渡される配列は、最終的な配列から除外されるオブジェクトの配列であることをここで言って。重要:Equatable
のプロパティが同じであるかもしれないが、他は異なるかもしれないオブジェクトの配列をマージする場合、重要です。
スイフト4.0版に述べたよう
extension Array where Element : Equatable {
public mutating func mergeElements<C : Collection>(newElements: C) where C.Iterator.Element == Element{
let filteredList = newElements.filter({!self.contains($0)})
self.append(contentsOf: filteredList)
}
}
:関数に渡された配列が最終アレイ
Althoこれは、ちょうど考えエレガントであるから省略するオブジェクトの配列です。 - let unique = Array(Set(a + b))。sort() 'は良く見えるでしょう... – Dravidian