首页 > 解决方案 > 创建一个没有重复的结构数组

问题描述

最近开始学习 Swift,现在遇到了问题(下面的代码将插入):

我从 3 个数组创建了一个结构数组。在创建结构的实例时,我需要通过随机(我理解的 randomElement)来完成 - 所有 3 个参数都必须是唯一的。如何检查函数的唯一性?

arrayOfHumans = createRandomHuman()

struct Human {
    let name: String
    let surname: String
    let age: String
    var email: String
}

var arrayOfHumans = [Human] () 
var humans: [Human] = []

let nameA  = ["Tim", "Mike", "Stan"]
let surnameA = ["Burk", "Sims", "Stoch"]
let ageA = ["12", "30", "25"]
let emailA = ["one@live.com", "two@gmail.com", "three@outlook.com"]

func createRandomHuman() -> [Human] {
    for _ in 1...3 {
        if nameA.isEmpty == false {
            let human = Human(name: nameA.randomElement()!,
                            surname: surnameA.randomElement()!,
                            age: ageA.randomElement()!,
                            email: emailA.randomElement()!)
            humans.append(human)
        }
    }
    return humans
}

实际结果:

first Struct {
    name: Tim
    surname: Sims
    age: 12
    email: three@outlook.com
}

second Struct {
    name: Mike
    surname: Stoch
    age: 25
    email: one@live.com
}

third Struct {
    name: Stan
    surname: Burk
    age: 30
    email: two@gmail.com
}

标签: arraysswiftrandomstruct

解决方案


一种解决方案是分别shuffle对 surname、age 和 email 数组进行排序,以获得随机但唯一的顺序。

let nameA  = ["Tim", "Mike", "Stan"]
let surnameA = ["Burk", "Sims", "Stoch"]
let ageA = ["12", "30", "25"]
let emailA = ["one@live.com", "two@gmail.com", "three@outlook.com"]

func createRandomHuman() -> [Human] {
    let shuffledSurnameA = surnameA.shuffled()
    let shuffledAgeA = ageA.shuffled()
    let shuffledEmailA = emailA.shuffled()
    var humans: [Human] = []
    for i in 0..<nameA.count {
        let human = Human(name: nameA[i],
                          surname: shuffledSurnameA[i],
                          age: shuffledAgeA[i],
                          email: shuffledEmailA[i])
            humans.append(human)
    }
    return humans
}

let arrayOfHumans = createRandomHuman()

另一种方法是洗牌索引

func createRandomHuman() -> [Human] {
    let indices = nameA.indices
    let shuffledIndices = (0..<3).map{ _ in indices.shuffled()}
    var humans: [Human] = []
    for i in 0..<nameA.count {
        let human = Human(name: nameA[i],
                          surname: surnameA[shuffledIndices[0][i]],
                          age: ageA[shuffledIndices[1][i]],
                          email: emailA[shuffledIndices[2][i]])
        humans.append(human)
    }
    return humans
}

推荐阅读