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