【问题标题】:NSRange array of odd or even countNSRange 奇数或偶数数组
【发布时间】:2015-10-04 12:06:40
【问题描述】:

我有一个包含 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是一个字符串数组。

我在这里缺少什么?s

【问题讨论】:

  • 不清楚Mydata()会产生什么样的数据。你必须解释你的神秘变量名,比如afa之类的。
  • 您的location 变量还需要基于新子数组的长度。无论原始数组的长度是多少,每次迭代的位置都是 0、19、38……。相反,location 必须是 i * newsubarraylen
  • @vacawama ,但有时它不会是偶数?我需要怎么做?
  • 您需要决定如何划分它们。例如,您想如何将 7 个项目分成 20 个部分?前 19 个部分得到 0,第 20 个部分得到 7 还是前 7 个部分得到 1,接下来的 13 个部分得到 0。23 个项目怎么样?是前 3 个部分获得 2,然后其余部分获得 1,还是前 19 个部分获得 1,最后一个获得 4?
  • 我认为我能得到的最低数组超过 35 个项目,所以它不应该成为一个大问题。我只是在尝试动态计算和划分,这真的花了我很多时间。 @vacawama。

标签: ios arrays swift uitableview nsrange


【解决方案1】:

三件事:

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

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
}

【讨论】:

    【解决方案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 的。

    【讨论】:

      【解决方案3】:

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

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

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

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

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

      【讨论】:

      • 但即便如此,我在迭代后的最后一个索引是 431 而不是 977,所以有问题!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多