Blog

Swift 4で文字列の配列から最長・最短の文字列を取得する方法

Swift 4で、文字列の配列[String]から最長・最短の文字列を取得する例です。文字数を比較するクロージャーを、max(by:)とmin(by:)に渡します。

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)	// 鳥栖市 (とす)
}

max(by:)とmin(by:)には、どちらも文字数が昇順になるように比較するクロージャーを指定します。


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.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)	// 宮崎市 (みやざき)
}

この実行例では、どちらも配列の末尾にある「宮崎市 (みやざき)」が返されました。

参考

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

← Blog