我有一个包含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
答案 0 :(得分:2)
三件事:
location
。为此,请引入location
变量以跟踪您在原始数组中的位置。count
可能不是20的倍数,因此您的某些部分需要更多商品。我认为您最好的方法是为第一个n
部分添加额外的项目以弥补剩菜。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
}
答案 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数组,这可能会表现得更好,但这并不是绝对必要的。