我有一个想要从传感器读取的流。这条小溪永远不会结束。大多数时候,这些值会随着时间的推移而重复。因此,我想确定值的运行,只保留每次运行的第一次和最后一次,并保留它们的时间戳。
['8:00',4,'8:01',4,'8:02',4,'8:03',7,'8:04',7,'8:05',8,'8:06',9,'8:07',13,'8:08',13,'8:09',13].lazy
我想将此数据压缩为:['8:00',4,'8:02',4,'8:03',7,'8:04',7,'8:05',8,'8:06',9,'8:07',13,'8:09',13]
然而,这个问题似乎具有内在的功能性。
发布于 2015-10-07 23:16:32
data.reduce([data.first]) do |result, item|
result.last.last == item.last ? result : result + [item]
end这并不能精确地产生您想要的输出-它跳过了运行的最后一项。但好消息是您不需要最后一项,因为您知道它的值与您的第一项相同,并且您知道它的时间戳比下一项小一。(如果您的时间戳不是连续的,那么这是不好的)。如果最后一个条目也不在Time.now上,最简单的做法就是在最后手动添加它。
它的用途:
我已经编写了它,以便每次迭代都会生成一个带有result + [item]的新result数组,这是使用reduce的函数风格和首选方式,但这会产生许多不必要的中间数组。您可以只通过实际追加(<<)来创建一个新数组。
https://stackoverflow.com/questions/32993904
复制相似问题