使用Big O符号的最有效方法,以避免多个forEach循环。

问题描述 投票:-1回答:1

我已经创建了这两个对象。

struct Person {
    let name: String
    let genderId: Int

}

struct Gender {
    let id: Int
    let sex: String
}

并创建这些数组。

let persons = [
    Person(name: "Steve", genderId: 1),
    Person(name: "Kate", genderId: 2),
    Person(name: "Mark", genderId: 1),
    Person(name: "Pam", genderId: 2)

]

let genders = [
    Gender(id: 1, sex: "girl"),
    Gender(id: 2, sex: "boy"),
]

为了在新对象的基础上创建一个对象数组,使用大O符号的最有效算法是什么?

struct PersonWithGenderString {
    let name: String
    let genderString: String
}

我已经用两个forEach循环写了这个方法,但我正在寻找一种迭代时间尽可能少的方法。

persons.forEach { (person) in
    genders.forEach { (gender) in
        if person.genderId == gender.id {
            let personWithGenderString = PersonWithGenderString(name: person.name, genderString: gender.sex)
            print(personWithGenderString)
        }

    }
}
swift algorithm foreach big-o
1个回答
-1
投票

如果你存储的是 Gender 对象的顺序 Gender.idgenders 数组,看来你是这样做的,你可以直接访问它们,而不是使用内部循环。

persons.forEach { (person) in
    let genderIndex = person.genderId - 1
    if genderIndex < 0 || genderIndex > genders.size {
       // handle this error (array out of bounds)
    }
    let personWithGenderString = PersonWithGenderString(name: person.name, genderString: genders[genderIndex].sex)
    print(personWithGenderString)
}

这将是O(1)转换任何特定的... PersonPersonWithGenderString 和O(n)转换n Persons至n PersonWithGenderStrings

© www.soinside.com 2019 - 2024. All rights reserved.