2016-08-23 3 views
1

をトリミングする方法...Effiecientのは、私が構造を持っているとしましょう配列

struct Person { 
    let isMale: Bool 
    let name: String 
} 

Person構造体の配列。私は

func trimMen(people: [Person]) -> [Person] 

    var trimmedPeople: [Person] = people 

    while trimmedPeople.first?.isMale { 
     trimmedPeople.removeFirst() 
    } 
    while trimmedPeople.last?.isMale { 
     trimmedPeople.removeLast() 
    } 
    return trimmedPeople 
} 

があります...(同様にあなたが文字列の先頭&最後から空白をトリムしたいどのように)配列の開始終了からすべての男性(isMale == true)をトリミングします迅速な方法でそれを行うより効率的な方法?

+6

これは完全に罰金、非常に読みやすいようです。コード行を減らすことを唯一の目的として巧みにしようとしないでください。 – ullstrm

+1

「よりスピーディーなやり方」は全くの意味がある限り、純粋に意見のように思えます。 – matt

+0

私は最初に読んでいなかったと思って答えを削除しました。配列の中央に男性を置いて、両端から削除するだけですか? – Steve

答えて

3

私は考えることができる最短の方法は次のとおりです。

//Find the first occurrence of a non-male person 
let firstIndex = people.index(where: {!$0.isMale}) ?? 0 

//Find the last occurrence of a non-male person and calculate the end index accordingly 
let lastIndex = people.count - 1 - 
       (people.reversed().index(where: {!$0.isMale}) ?? 0) 

//Create an array of the subsequence. 
let trimmedPeople = Array<Person>(people[firstIndex...lastIndex]) 
+1

また、そのisMale条件をクロージャパラメータに抽出します。 – Sulthan

+2

空の配列でクラッシュします。それは単一の男性要素では機能しません。 –

+2

また、私は2つの男性との配列を持っている場合、それは同じ配列を返します –

関連する問題