web-dev-qa-db-ja.com

Swift-[String]配列で最長の文字列を見つけるためのベストプラクティス

文字列配列で最長の文字列を取得するための最も効果的な方法を見つけようとしています。例えば ​​:

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

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

maxElement funcを使用してみましたが、アルファベットのアイデア(maxElement())で最大文字列が表示されます。

何か提案はありますか?ありがとう!

14
Roi Mulia

O(n log(n))であるソートの代わりに、O(n)であるmax(by:)を使用します。 )配列で、文字列の長さを比較するためのクロージャを提供します。

Swift 4:

Swift 4の場合、countStringプロパティを使用して文字列の長さを取得できます。

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)
}

注:maxElementO(n)です。適切な並べ替えはO(n log(n))であるため、大きな配列の場合、これは並べ替えよりもはるかに高速です。

32
vacawama

これを行うには、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のソリューションを使用することをお勧めします。

5
Hamish

どうぞ:

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]
3
Fred Faust