LoginSignup
0
0

More than 5 years have passed since last update.

[Swift] 配列を要素数numの配列の配列に変換する

Posted at

いつどこでなぜ使うのかよくわかってませんが、できてしまったので記しておきます。
多分 O(N) です。

extension Array {

    /// 配列を要素数が num の配列の配列にする
    ///
    /// let array = [1, 2, 3, 4, 5]
    /// let splited = array.split(num: 2)
    /// print(splited)
    /// // Prints "[[1, 2], [3, 4], [5]]"
    ///
    /// Complexity: O(N)
    func split(num: Int) -> [[Element]] {

        /// 配列を半分に分けて前半後半それぞれをもう一度半分に分ける
        /// これを要素数が num 以下になるまで繰り返す

        // countはO(N)なので定数に押さえておく
        let count = self.count

        // 要素数が num 以下の時 除算の回数を減らすため早期return
        if count <= num {

            return [self]
        }
        // 要素数が 2 * num 以下の時 除算の回数を減らすため早期return
        if count <= num * 2 {

            return [Array(self[0..<num]), Array(self[num...])]
        }

        // 前半の要素数が num の整数倍になるように分割点を求める
        let splitPoint = Int(count / num / 2) * num

        switch splitPoint {

        // 前半の要素数が num の時
        case num:
            return [Array(self[0..<num])]
                + Array(self[num...]).split(num: num)

        // 前半の要素数が num 以上の時
        case (num...):
            return Array(self[0..<splitPoint]).split(num: num)
                + Array(self[splitPoint...]).split(num: num)

        default:
            fatalError("ここには到達しない")
        }
    }
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0