Подтвердить что ты не робот

Итерация по двум массивам одновременно

Я новичок в Swift. Я занимаюсь программированием на Java. У меня сценарий для кода в Swift.

Следующий код находится в Java. Мне нужно закодировать в Swift для следующего сценария

// 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.

Не могли бы вы предоставить вашу помощь по синтаксисам для циклирования по индексу

4b9b3361

Ответ 1

Вы можете использовать zip(), который создает последовательность пар из двух заданных последовательностей:

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

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

Последовательность перечисляет только "общие элементы" данных последовательностей/массивов. Если они имеют разную длину, то дополнительная элементы более длинного массива/последовательности просто игнорируются.

Ответ 2

Попробуйте следующее:

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

Ответ 3

Вы также можете enumerate по одному массиву и использовали индекс для просмотра второго массива:

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

Ответ 4

С Swift 5 вы можете использовать один из 4 следующих кодов игровой площадки, чтобы решить вашу проблему.


# 1. Использование функции zip(_:_:)

В простейшем случае вы можете использовать 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. Использование makeIterator() Array makeIterator() и цикла while

Также легко зацикливать два массива одновременно с помощью простого цикла 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

В некоторых случаях вы можете захотеть создать свой собственный тип, который соединяет элементы ваших массивов инициалов. Это возможно, если ваш тип будет соответствовать IteratorProtocol. Обратите внимание, что, сделав ваш тип также соответствующим протоколу Sequence, вы можете использовать его экземпляры непосредственно в цикле 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)")
}

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

# 4. Использование AnyIterator

В качестве альтернативы предыдущему примеру вы можете использовать AnyIterator. Следующий код показывает возможную реализацию этого внутри метода расширения 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)")
}

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

Ответ 5

Вы можете использовать Range, если вы все еще хотите использовать 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])
}

Ответ 6

> 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"]

Ответ 7

for(var i = 0; i < strArr1.count ; i++)
{
    println(strArr1[i] + strArr2[i])
}

Это должно сделать это. Никогда раньше не использовал swift, поэтому обязательно проверьте.

Обновлено до последнего синтаксиса Swift

for i in 0..< strArr1.count {
    print(strArr1[i] + strArr2[i])
}