Swift4 文字列配列の中から、最大・最小の長さのものを取得する方法
文字列配列[String]
の中から最大長、最小長の文字文字を探す書き方です。
let strs:[String] = [
"北九州市 (きたきゅうしゅう)", // max
"久留米市 (くるめ)",
"鳥栖市 (とす)", // min
"伊万里市 (いまり)",
"神埼市 (かんざき)",
]
// 最大長を取得する byには「昇順」になるように指定する。
if let maxstr = strs.max(by: {$1.count > $0.count}) {
print(maxstr) // 北九州市 (きたきゅうしゅう)
}
// 最小長を取得する byにはmaxと同じく、「昇順」になるように指定する。
if let minstr = strs.min(by: {$1.count > $0.count}) {
print(minstr) // 鳥栖市 (とす)
}
Array.max
Array.min
を使って、by に比較を行うクロージャーを指定します。
min,max の比較関数には どちらも昇順になるように指定 します。
max(by:) - Array | Apple Developer Documentation
areInIncreasingOrder A predicate that returns true if its first argument should be ordered before its second argument; otherwise, false.
min(by:) - Array | Apple Developer Documentation
areInIncreasingOrder A predicate that returns true if its first argument should be ordered before its second argument; otherwise, false.
同じ長さの文字列がある場合の挙動は?
では同じ長さの文字列がある場合どれが見つかるのでしょうか?
let strs:[String] = [
"小林市 (こばやし)",
"日南市 (ニチナン)",
"延岡市 (のべおか)",
"日向市 (ひゅうが)",
"宮崎市 (みやざき)",
]
// 最大長を取得する byには「昇順」になるように指定する。
if let maxstr = strs.max(by: {$1.count > $0.count}) {
print(maxstr) // 小林市 (こばやし)
}
// 最小長を取得する byにはmaxと同じく、「昇順」になるように指定する。
if let minstr = strs.min(by: {$1.count > $0.count}) {
print(minstr) // 小林市 (こばやし)
}
一番先頭のものが1つヒットしました。
比較関数を変更した場合の挙動は?
同じ長さの文字列の場合に、比較関数に>=を付けてみるとどうなるでしょうか。
比較関数を変更「=」を付けた
{$1.count > $0.count}
↓
{$1.count >= $0.count}
let strs:[String] = [
"小林市 (こばやし)",
"日南市 (ニチナン)",
"延岡市 (のべおか)",
"日向市 (ひゅうが)",
"宮崎市 (みやざき)",
]
// 最大長を取得する byには「昇順」になるように指定する。
if let maxstr = strs.max(by: {$1.count >= $0.count}) {
print(maxstr) // 宮崎市 (みやざき)
}
// 最小長を取得する byにはmaxと同じく、「昇順」になるように指定する。
if let minstr = strs.min(by: {$1.count >= $0.count}) {
print(minstr) // 宮崎市 (みやざき)
}
配列末尾の要素がヒットしました。 なんとなくmax,minのアルゴリズムがわかるような気がします。
後記
もちろん他にもたくさんの書き方があります。
未だに配列の要素処理は for(i=0;i<num;i++){...}
を思い浮かべてしまいますが、モダン言語の配列操作にも慣れたいと思います!
参考
Swift - best practice to find the longest string at [String] array - Stack Overflow
max(by:) - Array | Apple Developer Documentation min(by:) - Array | Apple Developer Documentation