给定一个元素数组和确定两个元素是否相同的条件,请返回一个新数组,其中已删除了连续的“相同”元素的运行,仅保留了终点。例如:
a = [ {k:'a',v:1}, {k:'b',v:1}, {k:'c',v:1},
{k:'d',v:2}, {k:'e',v:2},
{k:'f',v:3}, {k:'g',v:3}, {k:'h',v:3}, {k:'i',v:3}, {k:'j',v:3},
{k:'k',v:2},
{k:'l',v:4}, {k:'m',v:4}, {k:'n',v:4}, {k:'o',v:4} ]
b = a.collapse_consecutive{ |h| h[:v] }
#=> [ {k:'a',v:1}, {k:'c',v:1},
#=> {k:'d',v:2}, {k:'e',v:2},
#=> {k:'f',v:3}, {k:'j',v:3},
#=> {k:'k',v:2},
#=> {k:'l',v:4}, {k:'o',v:4} ]
在折线图上绘制n个点时,一系列连续的同值结果对曲线图没有影响,除了端点。在下面的图中,黑色样品对最终图形没有影响。我正在存储精细采样的图,并且理想情况下希望删除所有不相关的样本。
对于这个问题,我正在简化问题,仅去除水平截面上的黑点,因为识别沿倾斜的线性截面落下的点(a)较难,(b)更为罕见(在我的情况下)。
到目前为止,我提出的最好的解决方案是依赖数组索引的解决方案:
class Array
def collapse_consecutive
select.with_index{ |o,i|
i==0 || yield(self[i-1])!=yield(o) ||
!self[i+1] || yield(self[i+1])!=yield(o)
end
end
end
这是可行的,但是依赖Ruby中的数组索引通常是“代码异味”:表明存在更优雅的实现。
使用Enumerable#chunk
和Enumerable#flat_map
:
a.chunk { |h| h[:v] }.flat_map { |c| [c[1][0],c[1][-1]].uniq }
[{:k =>“ a”,:v => 1},{:k =>“ c”,:v => 1},{:k =>“ d”,:v => 2},{ :k =>“ e”,:v => 2},{:k =>“ f”,:v => 3},{:k =>“ j”,:v => 3},{:k =>“ k”,:v => 2},{:k =>“ l”,:v => 4},{:k =>“ o”,:v => 4}]]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句