2016-04-27 21 views
3

文字列配列で最も長い文字列を取得する最も効果的な方法を見つけることを試みています。たとえば、次のようにSwift - [String]配列の最長文字列を見つけるベストプラクティス

let array = ["I'm Roi","I'm asking here","Game Of Thrones is just good"] 

と結果は次のようになります - "Game Of Thrones is just good"

それはアルファベットのアイデア(maxElement())で最大の文字列を与えるだカントー私は、maxElement FUNCを使用してみました。

ありがとう!

答えて

20

代わりのOでソート(N)(ログ)良いソートのために、それを提供アレイ上O(n)のあるmax(by:)を使用

スウィフト4:文字列の長さを比較するための閉鎖

スウィフト4については、あなたが文字列の長さを得ることができますStringcountプロパティ:

let array = ["I'm Roi","I'm asking here","Game Of Thrones is just good"] 

if let max = array.max(by: {$1.count > $0.count}) { 
    print(max) 
} 

スウィフト3:

let array = ["I'm Roi","I'm asking here","Game Of Thrones is just good"] 

if let max = array.max(by: {$1.characters.count > $0.characters.count}) { 
    print(max) 
} 

スウィフト2:

利用上

使用.characters.countは、文字列の長さを取得します文字列の長さを比較するためにそれに閉鎖を提供するアレイ上の3210:

let array = ["I'm Roi","I'm asking here","Game Of Thrones is just good"] 

if let max = array.maxElement({$1.characters.count > $0.characters.count}) { 
    print(max) 
} 

maxElementO(N)あります。良い並べ替えはO(n log(n))です。大規模な配列の場合、ソートよりもはるかに高速です。

+0

ありがとうございました!それはとても感謝しています - きれいでエレガントです:) –

5

これを行うにはreduceを使用できます。それはあなたの配列を繰り返し、現在の最長文字列を追跡し、終了時にそれを返します。例えば

let array = ["I'm Roi","I'm asking here","Game Of Thrones is just good"] 

if let longestString = array.reduce(Optional<String>.None, combine:{$0?.characters.count > $1.characters.count ? $0:$1}) { 
    print(longestString) // "Game Of Thrones is just good" 
} 

Optional.Noneが今スウィフト3でOptional.noneであることに留意されたい)

これは、配列が空である可能性があるという事実を考慮してnil開始値を使用して、として@JHZによって指摘されています(その場合はnilを返します)。あなたの配列は、少なくとも一つの要素を持っている知っている場合、あなたはそれを簡略化することができます。それだけ反復しているので、一度各要素を

let longestString = array.reduce("") {$0.characters.count > $1.characters.count ? $0:$1} 

、それが迅速sort()を使用するよりもなります。私は速いベンチマークを行い、sort()は約20倍遅く表示されます(早すぎる最適化のポイントはありませんが、それは言及する価値があると感じています)。


編集:私はそれがreduceよりも、きれいだとあなたは、@のvacawamaのソリューションで行くお勧めします!

+1

このアルゴリズムはO(n)です。良い並べ替えはO(n log(n))なので、大規模な配列の場合は* much *速くなります。 – vacawama

+1

私はreduceの初期値として 'nil'を使い、オプションの値を返します。 '[]'の中で最も長い文字列は '' ''ではなく、存在しません。 – JHZ

+0

良い点@JHZ、私は私の答えを編集しました。 – Hamish

4

ここに行く:

let array = ["I'm Roi","I'm asking here","Game Of Thrones is just good"] 

var sortedArr = array.sort() { $0.characters.count > $1.characters.count } 

let longestEelement = sortedArr[0] 
+0

簡単な解決策のようです。 – Brduca

+0

ありがとうございました! –

+0

sortedArr [0]の代わりにsortedArr.firstを使用します。したがって、空の配列の場合はlongestElementはオプションです。 – hacker2007

関連する問題