【问题标题】:Ruby 2D array transpose - variables not working as expectedRuby 2D 数组转置 - 变量未按预期工作
【发布时间】:2014-03-28 12:44:51
【问题描述】:

您好,我是 Ruby 新手,可以使用下面的代码获得一些帮助。

这应该转置一个二维数组。首先,我知道使用my_array.transpose 将完成与整个方法相同的事情。这对我来说是一个学习练习,因为我不知道为什么我的代码正在做它正在做的事情,所以它正在发挥作用。

同样,这应该转置一个二维数组。它实际上在做的是创建一个具有正确数量的嵌套数组(行)的数组,但它们都是空的。

此外,我的方法似乎正在更改 my_array 的值,我不希望它这样做。看起来我的变量出了点问题,我已经测试了代码,new_row 确实包含正确的预期值,因为它通过它的循环 - 但不知何故,当我调用 new_row.clear 它也会擦除 @987654325 中的值@。

编辑 - 澄清我所说的转置的意思,给定下面代码中的数组,转置的数组应该是:
[
[0,4,8]
[1,5,9]
[2,6,10]
[3,7,11]
]

def my_transpose(inital_array)
  new_row = []
  new_array = []
  new_row_start = 0
  indexer = 0

  row_count = inital_array.count
  inital_array.flatten!
  col_count = inital_array.count / row_count

  col_count.times do 
    row_count.times do 
      new_row<<inital_array[indexer]
      indexer += col_count
    end
    new_array<<new_row
    new_row_start += 1
    indexer = new_row_start
    new_row.clear
  end
  return new_array
end

my_array = [
  [0,1,2,3],
  [4,5,6,7],
  [8,9,10,11]
]
new_array = my_transpose(my_array)
print "old array:"
print my_array.inspect
puts
print "new array:"
puts new_array.inspect

【问题讨论】:

  • 转置数组是什么意思?
  • 初始数组中的现有行应该对应于新数组中的列,反之亦然。

标签: ruby arrays scope transpose


【解决方案1】:

你的问题是明确的。您正在清除刚刚创建的同一个数组。所以你正在失去你的工作。

你想要的而不是明确的实际上是创建一个新数组:

new_row = []

关于您更改 my_array 的原因是因为您使用的是 bang 方法。 flatten!。大多数以! 结尾的所有方法都是可变方法。也就是说,它们会更改您调用它的对象。所以你在使用时需要小心。

这是一个解决方法。只需分配返回新对象的普通flatten 的结果。

inital_array = inital_array.flatten

【讨论】:

  • 谢谢,在阅读了上面的另一个答案后,我发现了问题的一部分。看看在这种情况下使用 new_row = [] 如何获得与使用 dupclear 相同的结果,这也说明了引用的工作方式。非常感谢!
【解决方案2】:

Ruby 中的大多数对象都是通过引用存储的——包括数组。在您的情况下发生的事情是您将 new_row 附加到 new_array 以正确存储行值。然后稍后,您将清除new_row。由于new_array 具有对同一对象的引用,因此new_array 中的行也会被清除。

dup添加到new_array时使用dup创建一个新的数组对象:

new_array << new_row.dup

当您调用initial_array.flatten! 时会发生相同的行为。 flatten! 方法修改接收器并在函数外部更新my_array 引用的相同数组。

【讨论】:

  • 谢谢,这行得通,我认为这是类似的事情,但不知道dup
  • 也看看伊斯梅尔的回答。他也有一些优点。
猜你喜欢
  • 1970-01-01
  • 2021-07-18
  • 2018-08-27
  • 1970-01-01
  • 2020-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多