こんな12年前の so の書き込み。
p.x = index / 3;
p.y = index % 3;
👉 c# - Convert 1D array index to 2D array index - Stack Overflow
さすが、先人先生。
やってみました。
長ったらしいですが考え方を思い出したいときのために。
🤔 配列をn個ずつに分割する
副産物としてこんなかんじに書けました。
extension Array {
func chunked(by: Int) -> [[Element]] {
return (0 ..< (self.count / by)).map {
Array(self[$0 * by ..< ($0 + 1) * by])
}
}
}
print(
[1, 2, 3, 4, 5, 6].chunked(by: 3)
)
// [[1, 2, 3], [4, 5, 6]]
🤔 まとめ
配列の変換
let d2: [[String]] = [
["あ", "い", "う", "え", "お"],
["か", "き", "く", "け", "こ"],
["さ", "し", "す", "せ", "そ"]
]
// 2次元から1次元 *
let d1 = d2.flatMap { $0 }
print(d1)
// ["あ", "い", "う", "え", "お", "か", "き", "く", "け", "こ", "さ", "し", "す", "せ", "そ"]
print(
// 1次元から2次元 *
(0 ..< d1.count / numCols).map {
Array(d1[($0 * numCols) ..< ($0 + 1) * numCols])
}
)
// [["あ", "い", "う", "え", "お"], ["か", "き", "く", "け", "こ"], ["さ", "し", "す", "せ", "そ"]]
extension 化する。
extension Array where Element: Collection {
func toD1() -> [Element.Element] { // nested
return self.flatMap { $0 }
}
}
extension Array {
func toD2(numCols: Int) -> [[Element]] {
return (0 ..< self.count / numCols).map {
Array(self[($0 * numCols) ..< ($0 + 1) * numCols])
}
}
}
1次元配列インデックスと2次元配列座標の関係
index = y * numCols + x
x = index % numCols
y = index / numCols
SwiftData の inMemory で実装してみたが遅かったので、@Observable クラスへ。
👉 【 SwiftUI 】 Pong Wars を SwiftUI に移植してみた
しかし、正直、勉強すればするほど謎が増えます !
— chanzmao (@maochanz) February 23, 2024
👉 【Swift】2次元配列 で 転置行列 ( transpose matrix )