2017-05-27 3 views
0

から配列をfor .. inを除去することが可能ですフィルタリング?(それはよりSwifty作るために)「別の

let arr1 = ["Bill", "John", "Richard", "Donald", "George"] 
let arr2 = ["ill", "ck", "rd", "ld"] 
var arr3 = Array<String>() 

for str in arr2 
{ 
    arr3 += arr1.filter{ $0.hasSuffix(str) } 
} 
debugPrint(arr3) // ["Bill", "Richard", "Donald"] 

ありがとう!

答えて

0

はいそうです。flatMapと一緒にマップ機能を使用してください。あなたがしたい場合はノー倍増(サフィックスが「d」があるときなど)、セット()を使用します

let names = ["Bill", "John", "Richard", "Donald", "George"] 
let suffixes = ["ill", "ck", "rd", "ld", "d"] 
let namesWithSuffixes = Set(suffixes.map({ suffix in names.filter({ name in name.hasSuffix(suffix) }) }).flatMap({ $0 })) 

をしかし、あなただけのループのために、古いを取り除くしたい場合は、forEachの()を使用することができます:

var arr3 = [String]() 
suffixes.forEach({ suffix in 
    arr3 += names.filter({ $0.hasSuffix(suffix) }) 
}) 

"swifty" map.filter.flatmapは29回の実行を使用していますが、元のソリューションと2番目のものは24回の実行のみを引き起こすことに注意してください。

enter image description here

+0

ok、ありがとう、xxtesaxx – Stephane

+0

ようこそ。私はmapとflatMapについて学んだので、それほど長いことではありませんでした。そして、多くの状況で、彼らは本当に役に立ちました(例えば、オプションを扱うとき、彼らは研究する価値があり、私を信頼します)。私は助けることができてうれしい – xxtesaxx

0

これは、より簡潔でわかりやすいと思いませんか?

arr3 = arr1.filter{name in arr2.contains{name.hasSuffix($0)}} 
+0

はいです。ありがとうございました – Stephane

関連する問題