数组 – 在两个元素的数组中拆分大数组

前端之家收集整理的这篇文章主要介绍了数组 – 在两个元素的数组中拆分大数组前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有大量的对象列表,我需要将它们分成一组两个元素用于UI propouse.

例:

[0,1,2,3,4,5,6]

成为这四个数组的数组

[[0,1],[2,3],[4,5],[6]]

分割阵列有很多种方法.但是,如果阵列很大,那么效率最高(成本最低)的是什么.

如果你正在寻找效率,你可以有一个方法,可以懒惰地生成每个2个元素的数组,所以你一次只能在内存中存储2个元素:
  1. public struct ChunkGen<G : GeneratorType> : GeneratorType {
  2.  
  3. private var g: G
  4. private let n: Int
  5. private var c: [G.Element]
  6.  
  7. public mutating func next() -> [G.Element]? {
  8. var i = n
  9. return g.next().map {
  10. c = [$0]
  11. while --i > 0,let next = g.next() { c.append(next) }
  12. return c
  13. }
  14. }
  15.  
  16. private init(g: G,n: Int) {
  17. self.g = g
  18. self.n = n
  19. self.c = []
  20. self.c.reserveCapacity(n)
  21. }
  22. }
  23.  
  24. public struct ChunkSeq<S : SequenceType> : SequenceType {
  25.  
  26. private let seq: S
  27. private let n: Int
  28.  
  29. public func generate() -> ChunkGen<S.Generator> {
  30. return ChunkGen(g: seq.generate(),n: n)
  31. }
  32. }
  33.  
  34. public extension SequenceType {
  35. func chunk(n: Int) -> ChunkSeq<Self> {
  36. return ChunkSeq(seq: self,n: n)
  37. }
  38. }
  39.  
  40. var g = [1,5].chunk(2).generate()
  41.  
  42. g.next() // [1,2]
  43. g.next() // [3,4]
  44. g.next() // [5]
  45. g.next() // nil

方法适用于任何SequenceType,而不仅仅是Arrays.

对于Swift 1,没有协议扩展,你有:

  1. public struct ChunkGen<T> : GeneratorType {
  2.  
  3. private var (st,en): (Int,Int)
  4. private let n: Int
  5. private let c: [T]
  6.  
  7. public mutating func next() -> ArraySlice<T>? {
  8. (st,en) = (en,en + n)
  9. return st < c.endIndex ? c[st..<min(en,c.endIndex)] : nil
  10. }
  11.  
  12. private init(c: [T],n: Int) {
  13. self.c = c
  14. self.n = n
  15. self.st = 0 - n
  16. self.en = 0
  17. }
  18. }
  19.  
  20. public struct ChunkSeq<T> : SequenceType {
  21.  
  22. private let c: [T]
  23. private let n: Int
  24.  
  25. public func generate() -> ChunkGen<T> {
  26. return ChunkGen(c: c,n: n)
  27. }
  28. }
  29.  
  30. func chunk<T>(ar: [T],#n: Int) -> ChunkSeq<T> {
  31. return ChunkSeq(c: ar,n: n)
  32. }

对于Swift 3:

  1. public struct ChunkIterator<I: IteratorProtocol> : IteratorProtocol {
  2.  
  3. fileprivate var i: I
  4. fileprivate let n: Int
  5.  
  6. public mutating func next() -> [I.Element]? {
  7. guard let head = i.next() else { return nil }
  8. var build = [head]
  9. build.reserveCapacity(n)
  10. for _ in (1..<n) {
  11. guard let x = i.next() else { break }
  12. build.append(x)
  13. }
  14. return build
  15. }
  16.  
  17. }
  18.  
  19. public struct ChunkSeq<S: Sequence> : Sequence {
  20.  
  21. fileprivate let seq: S
  22. fileprivate let n: Int
  23.  
  24. public func makeIterator() -> ChunkIterator<S.Iterator> {
  25. return ChunkIterator(i: seq.makeIterator(),n: n)
  26. }
  27. }
  28.  
  29. public extension Sequence {
  30. func chunk(_ n: Int) -> ChunkSeq<Self> {
  31. return ChunkSeq(seq: self,5].chunk(2).makeIterator()
  32.  
  33. g.next() // [1,4]
  34. g.next() // [5]
  35. g.next() // nil

猜你在找的Swift相关文章