奇数或偶数的 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 数组,这可能会表现得更好,但这并不是绝对必要的。
三件事:
- 您需要从前一个停止的地方开始每个
location
。为此,引入一个 location
变量来跟踪您在原始数组中的位置。
- 您的某些部分将需要更多项目,因为您的
count
可能不是 20 的倍数。我认为最好的办法是给第一个 n
部分一个额外的项目来弥补剩下的。
- 您的循环需要迭代 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.
我有一个包含 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 数组,这可能会表现得更好,但这并不是绝对必要的。
三件事:
- 您需要从前一个停止的地方开始每个
location
。为此,引入一个location
变量来跟踪您在原始数组中的位置。 - 您的某些部分将需要更多项目,因为您的
count
可能不是 20 的倍数。我认为最好的办法是给第一个n
部分一个额外的项目来弥补剩下的。 - 您的循环需要迭代 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.