【问题标题】:Creating an array of struct without duplicates创建一个没有重复的结构数组
【发布时间】:2019-04-03 16:45:28
【问题描述】:

最近开始学习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
}

【问题讨论】:

  • 你想让所有 4 个属性保持唯一吗?
  • 是的,所有人都是独一无二的
  • 如果您只想使用每个元素一次,您应该打乱数组并循环遍历它们,而不是每次都选择一个随机元素。
  • 您应该首先定义一个唯一性规则。姓名、姓氏和年龄很常见。

标签: arrays swift random struct


【解决方案1】:

一个解决方案是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
}

【讨论】:

  • 由于数组中的所有元素都在使用,因此只需要打乱 3 个数组:)
  • @JoakimDanielson 很好,谢谢,我更新了答案
  • 更有效的方法是对索引进行洗牌(这与仅 3 个元素无关)
【解决方案2】:

如果我没听错的话,你想确保所有随机创造的人类都是不同的。
如果是这样,问题是2个人什么时候不同。这取决于你的问题。因此,您作为程序员必须定义它。
你可以通过采用Equatable protocol来做到这一点。
只要您的结构符合此协议,您就可以遍历所有先前启动的人类,并检查新随机创建的人类是否等于其中之一。如果是这样,请创建一个新的。

【讨论】:

  • 在这种情况下,人们在各个方面都不同 - 姓名、姓氏、年龄和电子邮件。我买的随机播放选项!
猜你喜欢
  • 2013-11-14
  • 2016-09-14
  • 2022-01-13
  • 2015-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-12
相关资源
最近更新 更多