【问题标题】:Find closest item in array of objects?在对象数组中找到最近的项目?
【发布时间】:2018-09-18 14:22:39
【问题描述】:

当我引用数组中的某个项目时,我想找到另一个最接近它且符合特定条件的项目。

例如,我有这个数组:

struct Person {
    var name = ""
    var age = ""
    var gender = ""
    var address = ""
}

let array = [Person(name:"ahmad",age:"22",gender:"male",address:"USA"),
             Person(name:"ahmad",age:"23",gender:"male",address:"KSA")]

现在假设我有一个对象:

let object = Person(name:"ahmad",age:"25",gender:"male",address:"USA")

基于此,我需要根据其所有属性的值在array 上找到离它最近的人。

例如,根据我上面的代码,array 中与object 最接近的对象是第一个,因为它们具有相同的namegenderaddress(3 个匹配的属性),而不是第二个,因为只有 2 个匹配的属性。

【问题讨论】:

  • “最近的项目”是一个很模糊的东西。你可能不得不自己做。只需在您的数组上创建一个循环,检查项目的每个属性,每次您检查的属性符合您的条件时递增一个计数器。然后,在每个计数器上再次循环以找到最大计数器。但同样,“最接近”是模糊的,所以你必须更具体地处理字符串和类似的东西..
  • @MartinR 我编辑了我的问题。

标签: arrays swift filter


【解决方案1】:

首先,您必须定义一个衡量“亲密度”的函数 两人。根据您的示例,可能是

struct Person {
    let name: String
    let age: String
    let gender: String
    let address: String

    // Compute a number measuring the “closeness” to another person,
    // with smaller numbers meaning “closer”.
    // For example: the number of non-matching properties.
    func distance(to other: Person) -> Int {
        return (name == other.name ? 0 : 1)
            + (age == other.age ? 0 : 1)
            + (gender == other.gender ? 0 : 1)
            + (address == other.address ? 0 : 1)
    }
}

然后可以使用min(by:)确定最近的人:

let object = Person(name:"ahmad", age:"25", gender:"male", address:"USA")
let closest = array.min(by: { $0.distance(to: object) < $1.distance(to: object) })!

print(closest) // Person(name: "ahmad", age: "22", gender: "male", address: "USA")

上述距离方法只是一个例子,你必须调整它 满足您的确切需求。

【讨论】:

  • 也许更精确的实现应该使用欧几里得距离而不是 0/1 结果
  • @CZ54:这将返回与给定对象的大多数属性匹配的人,这就是我理解问题的方式。当然,可以根据不同的需求修改指标。
  • 我只是添加技术,你的答案当然有效
  • 该死!不得不站起来并留下了一半的书面答案。你先到了那里。哈哈:D
猜你喜欢
  • 1970-01-01
  • 2021-07-30
  • 2019-11-02
  • 2019-12-16
  • 2022-11-16
  • 1970-01-01
  • 1970-01-01
  • 2013-02-28
  • 2022-01-12
相关资源
最近更新 更多