コピペ用
二次元配列の各要素から、同じ位置にあるものを集めて新しい配列を作る
[[あ, い, う, え, お], [か, き, く, け, こ], [さ, し, す, せ, そ]]
->
[[あ, か, さ], [い, き, し], [う, く, す], [え, け, せ], [お, こ, そ]]]
Extensions.swift
// 転置行列
extension Array where Element: RandomAccessCollection, Element.Index == Int {
func transpose() -> [[Element.Element]] {
return self.isEmpty ? [] : (0...(self.first!.endIndex - 1)).map { i -> [Element.Element] in self.map { $0[i] } }
}
}
使い方
配列に対して .transpose()
を使う
Sample.swift
let a = [
[1, 2, 3],
[4, 5, 6]
].transpose()
// a: [
// [1, 4],
// [2, 5],
// [3, 6]
// ]
let b = [
["あ", "い"],
["か", "き"],
["さ", "し"]
].transpose()
// b: [
// ["あ", "か", "さ"],
// ["い", "き", "し"]
// ]
さいごに
細かくいじらない汎用的なコードは可読性よりもコンパクトさを優先してます
Thanks
- @ensan_hcl : 汎用化されたコードの提供