2017-07-15 39 views
0

配列からいくつかの要素を削除する必要がある次のような状況があります。配列からいくつかの要素を削除する

[ 
    "white & blue", "white & red", "white & black", 
    "blue & white", "blue & red", "blue & black", 
    "red & white", "red & blue", "red & black", 
    "black & white", "black & blue", "black & red", 
    "white", "blue", "red", "black", 
    "white & blue & red & black" 
] 

は私は、これらの要素を持つ配列にこれを変換する必要があります:以下のように私は要素を持つ配列を有する

[ 
    "white & blue", "white & red", "white & black", 
    "blue & red", "blue & black", 
    "red & black", 
    "white", "blue", "red", "black", 
    "white & blue & red & black" 
] 

を上記の例では、要素"white & blue""blue & white"はとして扱われる必要がありますそれらのうちの1つだけを保持し、他のものを取り除く。

私は動作する方法が見つかりませんでした。私はそれをどのようにすることができますか?記載等しいかどう

+0

これは、あまりにも多くの部分を持っており、それが現在のように広すぎます。高レベルでは、文字列を解析し、結果の出力を標準化し、重複を除外し、結果を元の形式に戻す必要があります。これらのどれがあなたの問題を引き起こしているのか把握し、個々の質問をする必要があります。 –

答えて

2

「白&青」及び「青&白」の要素が等価でよくSet作品のために定義され、同じとして扱われる必要があります。製造のために

extension String { 
    var colorNameSet: Set<String> { 
     let colorNames = self.components(separatedBy: "&") 
      .map {$0.trimmingCharacters(in: .whitespaces)} 
     return Set(colorNames) 
    } 
} 

"white & blue".colorNameSet == "blue & white".colorNameSet //== true 

(各色名と仮定すると、最高1回、各要素で表示されます。)配列から重複して削除するとき

そしてもう一つSetは、Setは非常に便利です。

removing duplicate elements from an array

だから、あなたはこのような何かを書くことができます:

let originalArray = [ 
    "white & blue", "white & red", "white & black", "blue & white", 
    "blue & red", "blue & black", "red & white", "red & blue", 
    "red & black", "black & white", "black & blue", "black & red", 
    "white", "blue", "red", "black", "white & blue & red & black"] 

func filterDuplicateColorNameSet(_ originalArray: [String]) -> [String] { 
    var foundColorNameSets: Set<Set<String>> = [] 
    let filteredArray = originalArray.filter {element in 
     let (isNew,_) = foundColorNameSets.insert(element.colorNameSet) 
     return isNew 
    } 
    return filteredArray 
} 

print(filterDuplicateColorNameSet(originalArray)) 
//->["white & blue", "white & red", "white & black", "blue & red", "blue & black", "red & black", "white", "blue", "red", "black", "white & blue & red & black"] 
+0

ありがとう、これは完全に機能しました。 – cwilliamsz

関連する問題