迭代Ruby中的二维数组并用字符串替换每个实例

时间:2014-08-01 04:49:38

标签: ruby arrays

  win_array = [ ["TL", "TM", "TR"], ["ML", "MM", "MR"], ["BL", "BM", "BR"], 
    ["TL", "ML", "BL"], ["TM", "MM", "BM"] , ["TR", "MR", "BR"], 
    ["TL", "MM", "BR"], ["TR", "MM", "BL"] ]


  win_array[0].map! {|x| x == "TR" ? "1" : x } #works for [0] array

  win_array[0..7].map! {|x| x == "TR" ? "1" : x } #doesn't work
  win_array.each.map! {|x| x == "TR" ? "1" : x }  #doesn't work
  win_array.each {|x| x.map! == "TR" ? "1" : x }  #doesn't work

我正试图永久性地改变" TR"的所有实例。在这个2D数组中为整数或字符串。我试过使用.map!以上概述的方法运气不佳。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

我将用于更改win_array[0](在第一次尝试中)的块传递给双嵌套map!调用,因此它会扫描每个元素。

win_array.map! { |a| a.map! { |x| x == "TR" ? "1" : x } }

答案 1 :(得分:0)

如果数组的每一行具有相同数量的元素(如示例所示),则可以将数组转换为Matrix对象,应用Matrix#collect(又名map) ,然后将矩阵转换回数组(当然,除非将其作为Matrix对象进行进一步处理,否则更方便。)

require 'matrix'

win_array = [ ["TL", "TM", "TR"], ["ML", "MM", "MR"], ["BL", "BM", "BR"], 
              ["TL", "ML", "BL"], ["TM", "MM", "BM"], ["TR", "MR", "BR"], 
              ["TL", "MM", "BR"], ["TR", "MM", "BL"] ]

win_array = Matrix[*win_array].map { |e| (e == "TR") ? "1" : e }.to_a
  #=>       [ ["TL", "TM", "1" ], ["ML", "MM", "MR"], ["BL", "BM", "BR"],
  #           ["TL", "ML", "BL"], ["TM", "MM", "BM"], ["1" , "MR", "BR"],
  #           ["TL", "MM", "BR"], ["1" , "MM", "BL"] ]

答案 2 :(得分:-1)

Ruby OOP tic-tac-toe hash / conditional / itiration

这可能会对你有所帮助,但也许不会大声笑 我们无法弄清楚如何输出我们的领带功能。