gpt4 book ai didi

arrays - 如何从 NSManagedObjects 数组中的每个日期中选择一个具有最高值的对象

转载 作者:行者123 更新时间:2023-11-28 06:02:11 25 4
gpt4 key购买 nike

SO 上有许多线程解释了从数组中获取最大值的不同方法(map、max(by:)、reduce、filteredArrayUsingPredicate)。我还考虑过构建一个 NSPredicate 以用于我的 fetchRequest。但我还没有找到任何线索,让我知道如何完成我想做的一件简单的事情。

我有一组 LiftEvent NSManagedObjects 并且在任何给定日期可以有多个 LiftEvent。我想在每个日期获取一个对象,并且我希望该对象是每个日期具有最大 oneRepMax 值的对象。

假设我将这些 LiftEvent 对象放在一个具有以下属性的数组中:

LiftEvent1.date = "3/1/18"
LiftEvent1.oneRepMax = 200

LiftEvent2.date = "3/2/18"
LiftEvent2.oneRepMax = 210

LiftEvent3.date = "3/2/18"
LiftEvent3.oneRepMax = 220

LiftEvent4.date = "3/3/18"
LiftEvent4.oneRepMax = 205

LiftEvent5.date = "3/3/18"
LiftEvent5.oneRepMax = 225

我想在每个日期中挑选出权重值最高的那个,它会给我这些:

LiftEvent1.date = "3/1/18"
LiftEvent1.oneRepMax = 200

LiftEvent3.date = "3/2/18"
LiftEvent3.oneRepMax = 220

LiftEvent5.date = "3/3/18"
LiftEvent5.oneRepMax = 225

我获取 LiftEvent 并像这样对它们进行排序:

let liftEvents = dataManager.fetchLiftsEventsOfType(liftEventTypeUuid)

var sortedLiftEvents = liftEvents.sorted(by: { $0.date.compare($1.date) == .orderedAscending })

当然,当我这样做时,我会得到一个具有最高 oneRepMax 值的 LiftEvent:

var maxLiftEvent = sortedLiftEvents.max { a, b in a.oneRepMax < b.oneRepMax }

如何从每个日期获取单个 LiftEvent,每个日期都具有该日期的最高 oneRepMax 值,并确保如果一个日期有多个与我只选择一个相同的 oneRepMax 值?

最佳答案

您可以在字典中按日期对所有事件进行分组,并获取每个日期的最大值。

由于您的日期可以有不同的小时/分钟/秒值,您需要按天区分每个日期,这可以通过计算给定日期与 1970 年 1 月 1 日之间的天数来实现。

let groupedEvents = Dictionary(grouping: liftEvents, by: { floor($0.date.timeIntervalSince1970 / 86400) })

这将生成一个 [Double: [LiftEvent]] 字典,键是自 1970 年以来的天数,值是当天发生的事件。

现在您已将所有事件按天分组,您可以映射该字典以查找感兴趣的事件:

let maxEventsPerDay = groupedEvents.map { $1.max(by: { $0.oneRepMax < $1.oneRepMax }) }

结果将是一组事件,每个事件具有最大 oneRepMax

关于arrays - 如何从 NSManagedObjects 数组中的每个日期中选择一个具有最高值的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49306087/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com