arrays - 更改数组元素的周围元素

标签 arrays ruby each

我是初学者,需要完成一些练习。我正在尝试操作一个二维数组,如果一个元素为 1,则周围的非对角线元素应更改为 1:

[[0,0,0,0],
[0,0,1,0],
[0,0,0,0],
[0,0,0,0]]

应该返回

[[0,0,1,0],
[0,1,1,1],
[0,0,1,0],
[0,0,0,0]]

我在使用嵌套的 each_with_index 时遇到了问题:在我调整了左右周围的初始更改后,随着方法的迭代,它通过先前的调整拾取并进行了不需要的更改。此外,应该更改“底部”元素的行会引发错误:

a = [[0,0,0,0],
     [0,0,1,0],
     [0,0,0,0],
     [0,0,0,0]
    ]

a.each_with_index do |m, n| # n == index of main array
    m.each_with_index do |x, y| # y == index of subarray
        if x == 1
            a[n][y+1] = 1 unless (a[n][y+1]).nil? #right
            a[n][y-1] = 1 unless (a[n][y-1]).nil? #left
            a[n-1][y] = 1 unless (a[n-1][y]).nil? #top
            a[n+1][y] = 1 unless (a[n+1][y]).nil? #bottom--currently giving an error
        end
    end
end

任何关于我如何着手解决这两个方面的建议都会受到欢迎。

最佳答案

为了避免上一步的干扰,您可以(深度)复制数组并将引用数组与修改数组分开,或者在修改数组之前提取所有相关索引。后者更好。此外,使用平面数组比处理嵌套数组容易得多,因此我将 a 与平面数组 b 相互转换,并在 b< 中工作.

b = a.flatten

b
.each_index.select{|i| b[i] == 1}
.each do
  |i|
  b[i - 1] = 1 if b[i - 1] and i - 1 >= 0
  b[i + 1] = 1 if b[i + 1]
  b[i - 4] = 1 if b[i - 4] and i - 4 >= 0
  b[i + 4] = 1 if b[i + 4]
end

a = b.each_slice(4).to_a
# => [[0, 0, 1, 0], [0, 1, 1, 1], [0, 0, 1, 0], [0, 0, 0, 0]]

关于arrays - 更改数组元素的周围元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36673138/

相关文章:

javascript - 将纬度/经度坐标推送到 Google map 数组

javascript - 如何根据过滤器返回新对象?

ruby-on-rails - Rails 邮件程序 "undefined method"错误。

javascript - 从多维数组中获取数组名称

ruby - 使用 Ruby 逐行读取、编辑和写入文本文件

ruby - 在 Ruby 中获取用户主目录的跨平台方式?

ruby - 将数组中的每个数组相交 - Ruby

Ruby 数组一次访问 2 个连续(链接)元素

php - 使用 PHP 检索多行数据

java - 如何从类创建对象数组,然后将它们传递给子类?