奇数或偶数的 NSRange 数组

NSRange array of odd or even count

我有一个包含 977 个数据的数组,我一直在尝试将其拆分为 UITableView 中的 20 个部分,但我无法正确处理,我正在尝试动态进行。就像如果我得到一个 312 或 32 或 545 的数组,方程应该除以它,并添加数组中的最后一个奇数元素,我将新数据放在数组中。

所以这就是我正在做的事情:

var dataof977 = Mydata()
var mutA  = NSMutableArray()

        for (var i = 0; i < 19; i++)
        {
            var halfArray : NSArray!
            var theRange = NSRange()

            theRange.location = i*19;
            theRange.length = dataof977.afa.count / 19
            halfArray = dataof977.afa.subarrayWithRange(theRange)
            mutA.addObject(halfArray)
        }

注意: dataof977 是 class 的引用,afa 是一个字符串数组。

我在这里错过了什么?s

您只进行了 19 次迭代,而不是 20 次。

for var i = 0; i < 20; i++

您使用的是数据计数的 19 分之一,而不是 20 分之一。您在循环中重复长度计算 19 次,这是多余的。

免除 NSRange 会更容易。只需遍历所有数组元素,保持计数器达到预先计算的子数组大小,一旦达到临界值,将其重置为零并启动一个新子数组以添加到结果数组。

如果您使用 Swift 数组,这可能会表现得更好,但这并不是绝对必要的。

三件事:

  1. 您需要从前一个停止的地方开始每个 location。为此,引入一个 location 变量来跟踪您在原始数组中的位置。
  2. 您的某些部分将需要更多项目,因为您的 count 可能不是 20 的倍数。我认为最好的办法是给第一个 n 部分一个额外的项目来弥补剩下的。
  3. 您的循环需要迭代 20 次,而不是 19 次。我已将其更改为使用 for in 更好的 Swift 样式。

var mutA  = NSMutableArray()

let sublength = dataof977.afa.count / 20
let leftovers = dataof977.afa.count % 20

// location of each new subarray    
var location = 0

for i in 0..<20
{
    var length = sublength

    // The first sections will have 1 more each
    if i < leftovers {
        length++
    }

    let theRange = NSMakeRange(location, length)

    let halfArray = dataof977.afa.subarrayWithRange(theRange)
    mutA.addObject(halfArray)

    // move location up past the items we just added
    location += length
}

如果你有可能使用 Swift 数组而不是 NSArray,你可以使用 stride 逐步迭代并将数组与最后一个数组中的剩余元素分成相等的部分:

let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

extension Array {
    func splitBy(subSize: Int) -> [[Element]] {
        return 0.stride(to: self.count, by: subSize).map { startIndex in
            let endIndex = startIndex.advancedBy(subSize, limit: self.count)
            return Array(self[startIndex ..< endIndex])
        }
    }
}

let chunks = arr.splitBy(5)

print(chunks) // [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12]]

注意:这是针对Swift 2.