# arrays - python实现迭代器 - 同时迭代两个数组

## zigzag iterator python (5)

``````// With String array - strArr1
String strArr1[] = {"Some1","Some2"}

String strArr2[] = {"Somethingelse1","Somethingelse2"}

for( int i=0;i< strArr1.length;i++){
System.out.println(strArr1[i] + " - "+ strArr2[i]);
}``````

``````var strArr1: [String] = ["Some1","Some2"]
var strArr2: [String] = ["Somethingelse1","Somethingelse2"]

for data in strArr1{
println(data)
}

for data in strArr2{
println(data)
}
// I need to loop over in single for loop based on index.``````

# ＃1。 使用 `zip(_:_:)` 函数

``````let strArr1 = ["Some1", "Some2", "Some3"]
let strArr2 = ["Somethingelse1", "Somethingelse2"]

let sequence = zip(strArr1, strArr2)

for (el1, el2) in sequence {
print("\(el1) - \(el2)")
}

/*
prints:
Some1 - Somethingelse1
Some2 - Somethingelse2
*/``````

# ＃2。 使用 `Array` 的 `makeIterator()` 方法和while循环

``````let strArr1 = ["Some1", "Some2", "Some3"]
let strArr2 = ["Somethingelse1", "Somethingelse2"]

var iter1 = strArr1.makeIterator()
var iter2 = strArr2.makeIterator()

while let el1 = iter1.next(), let el2 = iter2.next() {
print("\(el1) - \(el2)")
}

/*
prints:
Some1 - Somethingelse1
Some2 - Somethingelse2
*/``````

# ＃3。 使用符合 `IteratorProtocol` 的自定义类型

``````struct TupleIterator: Sequence, IteratorProtocol {

private var firstIterator: IndexingIterator<[String]>
private var secondIterator: IndexingIterator<[String]>

init(firstArray: [String], secondArray: [String]) {
self.firstIterator = firstArray.makeIterator()
self.secondIterator = secondArray.makeIterator()
}

mutating func next() -> (String, String)? {
guard let el1 = firstIterator.next(), let el2 = secondIterator.next() else { return nil }
return (el1, el2)
}

}

let strArr1 = ["Some1", "Some2", "Some3"]
let strArr2 = ["Somethingelse1", "Somethingelse2"]

let tupleSequence = TupleIterator(firstArray: strArr1, secondArray: strArr2)

for (el1, el2) in tupleSequence {
print("\(el1) - \(el2)")
}

/*
prints:
Some1 - Somethingelse1
Some2 - Somethingelse2
*/``````

# ＃4。 使用 `AnyIterator`

``````extension Array {

func pairWithElements(of array: Array) -> AnyIterator<(Element, Element)> {
var iter1 = self.makeIterator()
var iter2 = array.makeIterator()

return AnyIterator({
guard let el1 = iter1.next(), let el2 = iter2.next() else { return nil }
return (el1, el2)
})
}

}

let strArr1 = ["Some1", "Some2", "Some3"]
let strArr2 = ["Somethingelse1", "Somethingelse2"]

let iterator = strArr1.pairWithElements(of: strArr2)

for (el1, el2) in iterator {
print("\(el1) - \(el2)")
}

/*
prints:
Some1 - Somethingelse1
Some2 - Somethingelse2
*/``````

``````var strArr1: [String] = ["Some1","Some2"]
var strArr2: [String] = ["Somethingelse1","Somethingelse2"]

for i in Range(start: 0, end: strArr1.count) {
println(strArr1[i] + " - " + strArr2[i])
}``````

``````let strArr1 = ["Some1", "Some2"]
let strArr2 = ["Somethingelse1", "Somethingelse2"]

for (e1, e2) in zip(strArr1, strArr2) {
print("\(e1) - \(e2)")
}``````

Swift 1.2：

``````for (index, element) in enumerate(strArr1) {
println(element)
println(strArr2[index])
}``````

``````for (index, element) in strArr1.enumerate() {
print(element)
print(strArr2[index])
}``````

``````for (index, element) in strArr1.enumerated() {
print(element)
print(strArr2[index])
}``````

``````> Incase of unequal count

let array1 = ["some1","some2"]
let array2 = ["some1","some2","some3"]

var iterated = array1.makeIterator()
let finalArray = array2.map({
let itemValue = iterated.next()
return "\(\$0)\(itemValue != nil ? "-"+itemValue! : EmptyString)" })``````

//结果：[“ some1-some1”，“ some2-some2”，“ some3”]