Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何从NSManagedObjects数组中的每个日期中选择值最高的对象_Arrays_Swift - Fatal编程技术网

Arrays 如何从NSManagedObjects数组中的每个日期中选择值最高的对象

Arrays 如何从NSManagedObjects数组中的每个日期中选择值最高的对象,arrays,swift,Arrays,Swift,上有许多线程,可以解释从数组中获取最大值的不同方法(map、max(by:)、reduce、filteradarayusingpredicate)。我还考虑构造一个NSPredicate,用于我的fetchRequest。但我还没有找到任何线索来告诉我如何完成一件简单的事情 我有一个LiftEventNSManagedObjects数组,在任何给定日期都可以有多个LiftEvent。我希望每个日期获得一个对象,并且希望该对象在每个日期都具有最大的oneRepMax值 假设我在具有以下属性的数组中

上有许多线程,可以解释从数组中获取最大值的不同方法(map、max(by:)、reduce、filteradarayusingpredicate)。我还考虑构造一个
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 })
但当然,当我这样做时,我会得到一个
LiftEvent
,其
oneRepMax
值最高:

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

如何从每个日期获取一个
lifteEvent
,每个日期都有最高的
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 }) }
让maxEventsPerDay=groupedEvents.map{$1.max(by:{$0.oneRepMax<$1.oneRepMax})

结果将是一个事件数组,每个事件的日期具有max
oneRepMax

首先,您需要按天对事件进行分组。您可以使用
Array.reduce(into:)
创建类型为
[Date:[LiftEvent]]]
的字典,在字典中可以使用
日历.current.startOfDay
对与一天对应的所有
日期
对象进行分组

然后您可以通过
Array.max(by:)
轻松找到每天的最大事件数

let dailyLiftEvents = liftEvents.reduce(into: [Date:[LiftEvent]](), { dailyLiftEvents, currentLiftEvent in
    dailyLiftEvents[Calendar.current.startOfDay(for: currentLiftEvent.date), default: [LiftEvent]()].append(currentLiftEvent)
})
let dailyMaxLiftEvents = dailyLiftEvents.map({$0.value.max(by: {$0.oneRepMax < $1.oneRepMax})})
let dailylliftevents=liftEvents.reduce(到:[Date:[LiftEvent]](),{dailylliftevents,currentLiftEvent in
dailyLiftEvents[Calendar.current.startOfDay(用于:currentLiftEvent.date),默认值:[LiftEvent]()]。追加(currentLiftEvent)
})
让dailyMaxLiftEvents=dailylliftevents.map({$0.value.max(by:{$0.oneRepMax<$1.oneRepMax})})

使用
[String:LiftEvent]
字典跟踪每个日期的最佳
LiftEvent
。添加新的时,请检查此日期是否已有一个,并检查哪一个具有最高的
oneRepMax
。如果新的更高,在字典中替换它。完成后,获取一个包含所有字典值的数组。我已经告诉过你了
map{$1.max(by:{$0.oneRepMax<$1.oneRepMax})}
同样的原则也适用here@LeoDabus专业缺陷,更新:P尽管我认为
$0.1
版本没有错误。这是有道理的,看起来应该可以工作,但是map函数没有过滤掉任何提升事件。我最终得到的和开始时一样多。我有这样一个:
let-groupedEvents=Dictionary(grouping:lifteEvents,by:{$0.date})
let-maxEventsPerDate=groupedEvents.map{$1.max(by:{$0.oneRepMax.value<$1.oneRepMax.value})
oneRepMax
是一个
度量值
,如果有区别的话。@Jim您的
date
属性有可能在小时/分钟/秒上有不同的值吗?在这种情况下,分组没有多大帮助。但为了确保我们在同一页上,
date
date
类型,还是像问题示例中的
String
类型?啊,它们是
date
类型。我是否应该将它们转换为
字符串
,并以某种方式去掉时间戳?