Development Tip

두 어레이를 동시에 반복

yourdevel 2020. 11. 16. 22:19
반응형

두 어레이를 동시에 반복


저는 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.

색인을 기반으로 반복되는 구문에 대한 도움을 주시겠습니까?


zip()주어진 두 시퀀스에서 쌍 시퀀스를 만드는를 사용할 수 있습니다 .

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

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

시퀀스는 주어진 시퀀스 / 배열의 "공통 요소"만 열거합니다. 길이가 다른 경우 더 긴 배열 / 시퀀스의 추가 요소는 무시됩니다.


이 시도:

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

enumerate하나의 배열 통해 인덱스를 사용하여 두 번째 배열 내부를 살펴볼 수도 있습니다.

스위프트 1.2 :

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

스위프트 2 :

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

스위프트 3 :

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

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. 사용 ArraymakeIterator()방법 및 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
 */

#삼. 다음을 준수하는 사용자 정의 유형 사용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

As an alternative to the previous example, you can use AnyIterator. The following code shows a possible implementation of it inside an Array extension method:

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

You could use Range if you still want to use 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])
}

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

// result : ["some1-some1","some2-some2","some3"]


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

That should do it. Never used swift before so make sure to test.

Updated to recent Swift syntax

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

참고URL : https://stackoverflow.com/questions/29217690/iterate-over-two-arrays-simultaneously

반응형