Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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
Ruby 如何将整数数组汇总为范围数组?_Ruby_Arrays_Algorithm_Functional Programming_Range - Fatal编程技术网

Ruby 如何将整数数组汇总为范围数组?

Ruby 如何将整数数组汇总为范围数组?,ruby,arrays,algorithm,functional-programming,range,Ruby,Arrays,Algorithm,Functional Programming,Range,我想输入以下信息: [1,2,4,5,6,7,9,13] 并将其转化为如下内容: [[1,2],[4,7],[9,9],[13,13]] 每个子数组表示一系列整数。函数方法使用: 工作原理:索引后,数组中的连续元素具有相同的x-idx,因此我们使用该值来对输入数组进行分块(连续项的分组)。最后,我们只需要使用每个组的第一个和最后一个元素来构建对。另一种方法 def summarize(x) x.inject([]) do |acc, value| if acc.last &

我想输入以下信息:

[1,2,4,5,6,7,9,13]
并将其转化为如下内容:

[[1,2],[4,7],[9,9],[13,13]]
每个子数组表示一系列整数。

函数方法使用:

工作原理:索引后,数组中的连续元素具有相同的
x-idx
,因此我们使用该值来对输入数组进行分块(连续项的分组)。最后,我们只需要使用每个组的第一个和最后一个元素来构建对。

另一种方法

def summarize(x)
  x.inject([]) do |acc, value|
    if acc.last && acc.last[1] + 1 == value
      acc.last[1] = value
      acc
    else
      acc << [value,value]
    end
  end
end
def汇总(x)
x、 注入([])do | acc,值|
如果acc.last&&acc.last[1]+1==值
acc.last[1]=值
行政协调会
其他的
acc嗯,这不是杰作,但我认为这可能是一个很好的直截了当的解决方案

[1,2,4,5,6,7,9,13].inject([]) do |m, v|
  if m.last.to_a.last == v.pred
    m[-1][-1] = v
  else
    m << [v, v]
  end
  m
end
[1,2,4,5,6,7,9,13]。注入([])do | m,v|
如果m.last.to_a.last==v.pred
m[-1][-1]=v
其他的

m这几乎直接来自方法文档:

ar = [1,2,4,5,6,7,9,13]
prev = ar[0]
ar.slice_before{|e|prev,prev2 = e,prev; prev2.succ != e}.map{|a|a.first..a.last}
#=> [1..2, 4..7, 9..9, 13..13]

这应该适用于字符、日期或任何使用
.succ
方法的内容。

这是一种比使用以下方法更简单的解决方案:


注意:
chunk\u在Ruby 2.3中引入了

时,您是否询问是否已经有代码来执行此操作?你这么问是因为你想自己做,但在实现上有困难吗?我自己做。在Ruby中似乎总是有一些有趣的方法来实现这类事情。应该根据哪些条件来构建范围?数组中的连续整数序列应该组成一个“范围”,它实际上只是一个有开始和结束的数组。可能的重复看起来非常好。完全忘记了新的块方法。再做一步,
.map{min,max | min==max?min:min..max}
将导致:
[1..2,4..7,9,13]
。或者,将
[pairs.first[0],pairs.last[0]
更改为
pairs.first[0]。。pairs.last[0]
获取所有位置的范围:
[1..2,4..7,9..9,13..13]
。在Ruby 2.4中,
enum\u将用于
中。我还发布了一个更简单的
chunk\u解决方案,而
ar = [1,2,4,5,6,7,9,13]
prev = ar[0]
ar.slice_before{|e|prev,prev2 = e,prev; prev2.succ != e}.map{|a|a.first..a.last}
#=> [1..2, 4..7, 9..9, 13..13]
xs.chunk_while { |a, b| a + 1 == b }.map do |seq|
  [seq.first, seq.last]
end