2016-11-28 59 views
4

我碰到一个需要成对迭代数组的问题。什么是最好的方法来做到这一点?或者,作为一种替代方法,将数组转换为数组对的最佳方式是什么(然后可以正常迭代)?Swift:配对元素的最佳方式是什么

这是我得到的最好的。它要求output是一个var,它不是很漂亮。有没有更好的办法?

let input = [1, 2, 3, 4, 5, 6] 

var output = [(Int, Int)]() 

for i in stride(from: 0, to: input.count - 1, by: 2) { 
    output.append((input[i], input[i+1])) 
} 


print(output) // [(1, 2), (3, 4), (5, 6)] 

// let desiredOutput = [(1, 2), (3, 4), (5, 6)] 
// print(desiredOutput) 
+0

如果什么元素的您的数组数它甚至没有?最后一个元素将一直被丢弃。 –

+0

假设有偶数个元素是安全的。 ( – Alexander

回答

14

您可以地图步幅,而不是迭代它, 允许得到的结果作为常数:

let input = [1, 2, 3, 4, 5, 6] 

let output = stride(from: 0, to: input.count - 1, by: 2).map { 
    (input[$0], input[$0+1]) 
} 

print(output) // [(1, 2), (3, 4), (5, 6)] 

如果你只需要遍历对和给定阵列很大,那么避免创建具有延迟映射的中间阵列可能是有利的:

for (left, right) in stride(from: 0, to: input.count - 1, by: 2) 
    .lazy 
    .map({ (input[$0], input[$0+1]) }) { 

    print(left, right) 

} 
+1

美女!在接受这个之前我会稍微等一下,我想看看还有什么会出现的 – Alexander

+0

@AlexanderMomchliov:好的 - 我假设你的问题是由http://stackoverflow.com/a/40841493/1187415? –

+0

驱动的。不完全是,我过去曾经有过几次这样的问题,那个问题就是打破​​了骆驼背的秸秆。如果我可以帮忙的话,不想教速度很快的人:p – Alexander

2

我不认为这是比任何马丁的r更好,但似乎OP需要别的东西......

struct PairIterator<C: IteratorProtocol>: IteratorProtocol { 
    private var baseIterator: C 
    init(_ iterator: C) { 
     baseIterator = iterator 
    } 

    mutating func next() -> (C.Element, C.Element)? { 
     if let left = baseIterator.next(), let right = baseIterator.next() { 
      return (left, right) 
     } 
     return nil 
    } 
} 
extension Sequence { 
    var pairs: AnySequence<(Self.Iterator.Element,Self.Iterator.Element)> { 
     return AnySequence({PairIterator(self.makeIterator())}) 
    } 
} 

input.pairs.forEach{ print($0) } 

let output = input.pairs.map{$0} 
print(output) //->[(1, 2), (3, 4), (5, 6)] 
+0

小建议(当然是个人喜好的问题):'Array(input.pairs)'而不是'... map {$ 0}','Self.'可以在'Self.Iterator.Element'中省略。 - 特别感谢*不*在*下一个方法中使用'guard' :) –

+0

@MartinR你能解释在'next'方法中使用'guard'有什么问题吗? – Alexander

+0

MartinR的解决方案工作得很好,我只想看看还有什么人在我接受他的答案之前提出的。这个解决方案是我正在考虑的另一个。感谢您实施它:) – Alexander

相关问题