如何解决使用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]]]]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。