使用each_with_slice拆分数组,但在结果数组中保留特定值一个线性

问题描述

我希望将数组转换为特定格式,并在可能的情况下以单行格式进行。使用each_slice(2).to_a有助于拆分数组,但是我想将每个数组的第二个坐标保留为下一个数组的第一个坐标。

初始数组

# format is [x1,y1,x2,y2,x3,y3,x4,y4]...

full_line_coords = [[1,1,2,3,4,4],[5,5,6,7,8,8]]

所需的输出

# desired format is [[[x1,y1],[x2,y2]],[[x2,y2],[x3,y3]],[[x3,y3],[x4,y4]]]...
desired = [[[1,1],[2,2]],[[2,2],[3,3]],[[3,3],[4,4]]]

没有单线的成功

# without one line:

desired = []
temp_array = []

full_line_coords.each do |x|
  temp_array << x.each_slice(2).to_a
end

temp_array.each do |x|
  i = 0
  until i == x.length - 1
    desired << [x[i],x[i+1]]
    i += 1
  end
end

p desired

# => [[[1,4]],[[5,5],[6,6]],[[6,6],[7,7]],[[7,7],[8,8]]]

不确定如何使它成为单行,发现进行分割很简单,但没有在每个数组中保留结束/开始坐标(如下所示)。

单线尝试

attempt = full_line_coords.each { |x| p x.each_slice(2).to_a.each_slice(2).to_a } # p to show this is where i'd like the array to be in 'desired' format if possible.

# => [[[1,4]]]
#    [[[5,8]]]

背景/理由

我希望保留它是单线的唯一原因是因为我想返回“父”对象本身,而不仅仅是返回结果属性。

“父对象”对象是链接列表:#<Link:0x803a2e8>,具有许多属性,包括“段”。

links.each do |l|
  puts l.segments
end

# Gives an array of XY coordinates,including all vertices. e.g. [1,4]

然后,我希望在其他已定义的方法中使用“期望的”输出,但要在链接#<Link:0x803a2e8>的末尾返回链接对象本身,而不仅仅是链接属性的乘积。

非常感谢。

解决方法

这是我找到的第一个选项:

full_line_coords.flat_map { |e| e.each_slice(2).each_cons(2).to_a } 

找到Enumerable类和Array类中的方法

,

输入

full_line_coords = [[1,1,2,3,4,4],[5,5,6,7,8,8]]

代码

p full_line_coords.map { |var| var.slice_when { |x,y| x != y }
                                   .each_cons(2)
                                   .to_enum
                                   .map(&:itself) }

输出

[[[[1,1],[2,2]],[[2,2],[3,3]],[[3,3],[4,4]]],[[[5,5],[6,6]],[[6,6],[7,7]],[[7,7],[8,8]]]]

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...