奇数或偶数的NSRange数组

时间:2015-10-04 12:06:40

标签: ios arrays swift uitableview nsrange

我有一个包含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是类的引用,afa是一个String数组。

我在这里缺少什么?s

3 个答案:

答案 0 :(得分:2)

三件事:

  1. 您需要启动前一个左侧的每个location。为此,请引入location变量以跟踪您在原始数组中的位置。
  2. 由于count可能不是20的倍数,因此您的某些部分需要更多商品。我认为您最好的方法是为第一个n部分添加额外的项目以弥补剩菜。
  3. 您的循环需要迭代20次,而不是19次。我已将其更改为使用for in,这是更好的Swift风格。
  4. 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
    }
    

答案 1 :(得分:2)

如果你有可能使用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。

答案 2 :(得分:0)

你只做了19次迭代,而不是20次。

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

你占据了19个数据,而不是20个。您在循环中重复长度计算19次,这是多余的。

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

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