web-dev-qa-db-fra.com

Itérer sur deux tableaux simultanément

Je suis nouveau à Swift. Je fais de la programmation Java. J'ai un scénario à coder pour dans Swift.

Le code suivant est en Java. J'ai besoin de coder dans Swift pour le scénario suivant

// 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]);
}

J'ai quelques matrices dans Swift

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.

Pourriez-vous s'il vous plaît fournir votre aide sur les syntaxes pour le bouclage sur base

49
Lohith

Vous pouvez utiliser Zip(), qui crée Une séquence de paires à partir des deux séquences données:

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

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

La séquence énumère uniquement les "éléments communs" des séquences/tableaux donnés. S'ils ont une longueur différente, les éléments Supplémentaires du tableau/séquence le plus long sont simplement ignorés.

107
Martin R

Essaye ça:

Zip([0,2,4,6], [1,3,5,7]).forEach {
    print($0,$1)
}

Zip([0,2,4,6], [1,3,5,7]).forEach {
    print($0.0,$0.1)
}
16
Rajesh Kumar

Vous pouvez également enumerate sur un tableau et utiliser l'index pour regarder à l'intérieur du second tableau:

Swift 1.2:

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

Swift 2:

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

Swift 3:

for (index, element) in strArr1.enumerated() {
    print(element)
    print(strArr2[index])
}
11
Jérôme Leducq

Avec Swift 4.2, vous pouvez utiliser l’un des 4 codes de terrain de jeu suivants pour résoudre votre problème.


#1. Utilisation de Zip(_:_:) function

Dans le cas le plus simple, vous pouvez utiliser Zip(_:_:) pour créer une nouvelle séquence de paires (Tuple) des éléments de vos tableaux initiaux.

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

let sequence = Zip(strArr1, strArr2)

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

# 2. Utilisation de Array 's makeIterator() et d'une boucle while

Il est également facile de passer en boucle sur deux tableaux simultanément avec une simple boucle while et des itérateurs:

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)")
}

# 3. Utilisation d'un type personnalisé conforme à IteratorProtocol

Dans certaines circonstances, vous voudrez peut-être créer votre propre type, qui associe les éléments de vos tableaux d'initiales. Ceci est possible en rendant votre type conforme à IteratorProtocol. Notez qu'en rendant votre type également conforme au protocole Sequence, vous pouvez en utiliser des occurrences directement dans une boucle for:

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)")
}

# 4. Utilisation de AnyIterator

Comme alternative à l'exemple précédent, vous pouvez utiliser AnyIterator. Le code suivant montre une implémentation possible dans une méthode d'extension Array:

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)")
}
3
Imanou Petit

Vous pouvez utiliser Range si vous souhaitez toujours utiliser for in.

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

for i in Range(start: 0, end: strArr1.count) {
    println(strArr1[i] + " - " + strArr2[i])
}
0
Ian MacDonald
> 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)" })

// résultat: ["some1-some1", "some2-some2", "some3"]

0
jeff ayan