文字列配列で最長の文字列を取得するための最も効果的な方法を見つけようとしています。例えば :
_let array = ["I'm Roi","I'm asking here","Game Of Thrones is just good"]
_
結果は次のようになります-_"Game Of Thrones is just good"
_
maxElement
funcを使用してみましたが、アルファベットのアイデア(maxElement()
)で最大文字列が表示されます。
何か提案はありますか?ありがとう!
O(n log(n))であるソートの代わりに、O(n)であるmax(by:)
を使用します。 )配列で、文字列の長さを比較するためのクロージャを提供します。
Swift 4:
Swift 4の場合、count
のString
プロパティを使用して文字列の長さを取得できます。
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)
}
Swift 3:
使用する .characters.count
on String
で文字列の長さを取得します:
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)
}
Swift 2:
配列でmaxElement
を使用して、文字列の長さを比較するためのクロージャを提供します。
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)
}
注:maxElement
はO(n)です。適切な並べ替えはO(n log(n))であるため、大きな配列の場合、これは並べ替えよりもはるかに高速です。
これを行うには、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
はSwift 3)でOptional.none
になっていることに注意してください)
これは、@ JHZによって指摘されているように、配列が空である可能性があるという事実を説明するためにnil
開始値を使用します(その場合はnil
を返します)。配列に少なくとも1つの要素があることがわかっている場合は、次のように簡略化できます。
let longestString = array.reduce("") {$0.characters.count > $1.characters.count ? $0:$1}
各要素を1回だけ反復するため、sort()
を使用するよりも高速になります。簡単なベンチマークを実行したところ、sort()
は約20倍遅く表示されます(時期尚早の最適化には意味がありませんが、言及する価値があると思います)。
編集:reduce
よりもクリーンなので、@ vacawamaのソリューションを使用することをお勧めします。
どうぞ:
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]