折叠数组中的连续“相同”元素

佛罗兹

目标

给定一个元素数组和确定两个元素是否相同的条件,请返回一个新数组,其中已删除了连续的“相同”元素的运行,仅保留了终点。例如:

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#chunkEnumerable#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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Erlang在列表中查找连续的相同元素

来自分类Dev

jQuery - 从数组中获取元素并按相同顺序输入每个连续的 td

来自分类Dev

您如何知道数组是否具有相同的连续元素?

来自分类Dev

在C中数组相同的元素

来自分类Dev

数组中连续元素的最大乘积

来自分类Dev

从数组中形成非连续元素对

来自分类Dev

PHP:数组中连续元素的数量

来自分类Dev

在数组中查找连续匹配元素

来自分类Dev

获取数组中连续元素的最大总和

来自分类Dev

在Matlab中查找连续相同值元素的平均数量

来自分类Dev

在Matlab中查找连续的相同值元素的平均数量

来自分类Dev

连续数组元素的计算

来自分类Dev

数组连续元素总和

来自分类Dev

连续数组元素的计算

来自分类Dev

在Python中随机选择数组中的连续元素

来自分类Dev

在Scala中如何对数组中的连续元素进行分组

来自分类Dev

比较Java中相同数组的元素

来自分类Dev

检查数组中哪些元素相同

来自分类Dev

PHP中相同数组的元素组合

来自分类Dev

多次查找数组中相同元素的索引

来自分类Dev

对数组中的两个连续元素求和

来自分类Dev

在数字数组中查找不连续的元素:Ruby

来自分类Dev

使用条件合并数组中的连续对象并更新合并的元素

来自分类Dev

如何在数组中查找连续的元素

来自分类Dev

连续计数列表和数组中的元素

来自分类Dev

如何合并受约束的数组中的连续元素?

来自分类Dev

创建一个由连续相同元素的三元组组成的数组

来自分类Dev

数组元素的连续组之和

来自分类Dev

检查数组元素是否连续