我有一个对象数组,其 struct 如下:

{
  id: String,
  userId: String,
  distance: Double,
  time: Double
}

在数组中,相同的userId在相同的距离内可以有多个条目.例如,数组可以是:

[
  { id: "1", userId: "1", distance: 100, time: 18.7 },
  { id: "2", userId: "1", distance: 100, time: 18.5 }, 
  { id: "3", userId: "2", distance: 100, time: 18.2 },
  { id: "4", userId: "2", distance: 200, time: 41.0 },
]

我想对数组进行筛选和排序,以便该数组只包含每个用户特定距离的最快时间.因此,如果我想使用上面的数组来查找100次,它将简单地返回:

[
  { id: "3", userId: "2", distance: 100, time: 18.2 },
  { id: "2", userId: "1", distance: 100, time: 18.5 },
]

我知道我可以用.filter来把它减少到.filter次,用.sort来安排时间,但我想不出怎么才能限制到每userId条只有1条.

推荐答案

您可以使用我添加到swift-algorithms(Apple托管的第一方包,就像Swift标准库的附件)的新grouped(by:)函数来实现这一点.

我们可以根据它们的距离和跑它们的用户来分组所有的比赛结果.在每组结果中,我们将 Select 一个最快的时间(该用户在该距离内).我把这个叫做userPersonalRecords.

从那里,我们可以根据距离进行筛选,以获得每个人最好的100米冲刺.

如果我们经常这样做,可能值得按距离对比赛结果进行分组,并保留结果array.或者,如果您有lots个结果,您可以将所有这些结果转储到一个小的SQLite DB中,并根据需要对查询执行相同的简单分组/排序.

struct RaceResult {
    let id: String
    let userId: String
    let distance: Double
    let time: Double
}

let raceResults = [
    RaceResult(id: "1", userId: "1", distance: 100, time: 18.7),
    RaceResult(id: "2", userId: "1", distance: 100, time: 18.5),
    RaceResult(id: "3", userId: "2", distance: 100, time: 18.2),
    RaceResult(id: "4", userId: "2", distance: 200, time: 41.0),
]

// This simple little struct is just a workaround for tuples not being Hashable
struct UserDistance: Hashable {
    let userId: String
    let distance: Double
}

let userPersonalRecords = raceResults
    .grouped {
        UserDistance(userId: $0.userId, distance: $0.distance)
    }
    .mapValues { raceResults in raceResults.max(by: { $0.time < $1.time })! }
    .values

let fastest100MTimes = userPersonalRecords.filter { $0.distance == 100 }

for raceResult in fastest100MTimes {
    print(raceResult)
}

Swift相关问答推荐

";async let和";async之间的差异让我们等待";

如何在DATE()中进行比较

从`compactMap()`闭包返回`nil`未通过结果类型判断

物理主体未与 spritekit Swift 的网格图案上的纹理图像对齐

计算 CoreData 中所有唯一对象的数量?

将 ArgumentParser 与 Swift 并发一起使用

如何修改下面的代码,使图像 Select 的顺序与使用快速并发的图像呈现的顺序相匹配?

Swift Combine:如何在保留发布者结果顺序的同时进行收集?

SwiftUI - Select 器没有 Select 值

将内容与工作表顶部而不是中间对齐

如何让 SwiftUI 中的文本在旋转框架的同时侧向显示?

如何从 LLDB 调用带有断点的 Swift 函数?

关闭 UITableViewRowAction

Swift - 导入我的 swift 类

如何在今天的扩展(iOS)中访问 CoreData 模型

不能从非开放类继承 swift

Swift 2.0 最低系统版本要求(部署目标)

如何停止 NSTimer.scheduledTimerWithTimeInterval

如何快速格式化用户显示(社交网络等)的时间间隔?

将 [String] 存储在 NSUserDefaults 中