programing

두 개의 어레이를 동시에 반복

closeapi 2023. 9. 23. 22:43
반응형

두 개의 어레이를 동시에 반복

저는 스위프트가 처음입니다.자바 프로그래밍을 하고 있습니다.스위프트에서 코딩할 시나리오가 있습니다.

다음 코드는 Java에 있습니다.아래 시나리오에 대해 스위프트로 코딩을 해야 합니다.

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

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

스위프트 5를 사용하면 다음 4가지 플레이그라운드 코드 중 하나를 사용하여 문제를 해결할 수 있습니다.


#1. 기능 사용하기

가장 간단한 경우에는zip(_:_:)초기 배열의 요소에 대한 새 쌍 시퀀스( tuple)를 만듭니다.

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의 방법과 잠시 동안의 순환

또한 간단한 루프 및 반복기를 사용하여 두 개의 어레이를 동시에 루프할 수 있습니다.

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. 당신의 타입 또한 다음과 같게 함으로써 주의하십시오.Sequenceprotocol, for loop에서 직접 인스턴스를 사용할 수 있습니다.

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. 다음 코드는 그것의 가능한 구현을 보여줍니다.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
 */

시도해 보기:

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

당신은 사용할 수 있습니다.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])
}
for(var i = 0; i < strArr1.count ; i++)
{
    println(strArr1[i] + strArr2[i])
}

그 정도면 됐다.스위프트를 사용해 본 적이 없으니 꼭 테스트해보세요.

최근 Swift 구문으로 업데이트됨

for i in 0..< strArr1.count {
    print(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)" })

// 결과 : ["some1-some1", "some2-some2", "some3"]

언급URL : https://stackoverflow.com/questions/29217690/iterate-over-two-arrays-simultaneously

반응형