我已经创建了这两个对象。
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)
}
}
}
如果你存储的是 Gender
对象的顺序 Gender.id
在 genders
数组,看来你是这样做的,你可以直接访问它们,而不是使用内部循环。
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)转换任何特定的... Person
到 PersonWithGenderString
和O(n)转换n Person
s至n PersonWithGenderString
s