2017-02-03 8 views
-2

から重複を削除しますが、私は文字列の配列を持っていると言う:私は重複を取り除くだろうかどのように配列

let arrayOfStrings = ["a", "b", "a", "c", "a", "d"] 

+2

その他:http://stackoverflow.com/q/40579554/2976878 – Hamish

+1

これは問題ありませんか? ** let uniqueArray = Array(Set(arrayOfStrings))** –

答えて

7

配列機能contains(_:)を使用して、要素がすでに配列に含まれているかどうかを確認できますが、それはかなり遅く、大きな配列の場合はうまく機能しません。エントリをSetにコピーし、Set操作を使用して重複を見つけて削除する方がよいでしょう。セットはセットメンバーシップのテストを高速化するために最適化されているため、if aSet.contains(item)if anArray.contains(item)よりもずっと高速です。

アイテムの順序を保持することに気にしない場合は、アレイをセットにコピーしてからアレイに戻すことができます。ただし、結果の配列内の項目の順序が異なることを意味します。

秩序を維持しながら、このように見えるかもしれませんが、文字列の配列から重複を除去する機能:

let arrayOfStrings = ["a", "b", "a", "c", "a", "d"] 
let uniqueStrings = uniqueElementsFrom(array:arrayOfStrings) 
print("Unique elements from \(arrayOfStrings) = \n” + 
    “\(uniqueStrings)") 

出力:あなたはこのようなコードでそれを呼び出すと

func uniqueElementsFrom(array: [String]) -> [String] { 
    //Create an empty Set to track unique items 
    var set = Set<String>() 
    let result = array.filter { 
    guard !set.contains($0) else { 
     //If the set already contains this object, return false 
     //so we skip it 
     return false 
    } 
    //Add this item to the set since it will now be in the array 
    set.insert($0) 
    //Return true so that filtered array will contain this item. 
    return true 
    } 
    return result 
} 

[ "A"、 "B"、 "A"、 "C"、 "A"、 "D" =

から

ユニークな要素であろう

は[「A」、 "B"、 "C"、 "D" は】

ただし、その関数は、文字列の配列で動作します。どんな種類の配列からも重複を取り除く関数を書くことができれば良いでしょう。

これはGenericsの仕事です。しかし、キャッチがあります。 Setsには、設定されたメンバーシップのテストを速く行うためにハッシュを使用するため、Hashableプロトコルに準拠するオブジェクトのみが含まれます。

uniqueElementsFrom(array:)関数を、Genericsを使用してHashableプロトコルに準拠する配列に変更することができます。このコードは次のようになります。関数名の後

func uniqueElementsFrom<T: Hashable>(array: [T]) -> [T] { 
    var set = Set<T>() 
    let result = array.filter { 
    guard !set.contains($0) else { 
     return false 
    } 
    set.insert($0) 
    return true 
    } 
    return result 
} 

<T: Hashable>ビットは、この機能の残りの部分が指定されていない型Tを参照してくださいます」と言うあなたが確認することができる唯一のことは、それがタイプTです。 Hashableプロトコルに準拠します。

この形式のuniqueElementsFrom(array:)関数は、要素がHashableの任意の配列に対して機能します。

+0

私はオブジェクトの配列を持っている場合、これは役立ちますか?そして、オブジェクト内に含まれる同じ緯度経度をフィルタリングする必要がありますか? –

+0

@LohithKorupolu、はい、同じアプローチを使用できます。 CLLocationオブジェクトはEquableなので、あなたのオブジェクトの配列にCLLocationsが含まれ、 '=='を使ってそれを比較することができます。ただし、場所は正確に同じでなければならないことに注意してください。複数のGPS測定値が同じ場所を表しているかどうかを確認しようとしている場合、位置の比較に「==」を使用しても機能しません。 –

関連する問題