【问题标题】:Ruby transpose table, array to string, regexRuby 转置表、数组到字符串、正则表达式
【发布时间】:2014-04-03 12:15:08
【问题描述】:

在 Ruby 中,我会有这个数组:

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

转换成这个矩阵或表格(无标题):

11100
11100
00011

我想要做的是取数组中每个数组的每个元素来转置数组,例如,在上面的表/数组中,我会将这个输出作为数组数组:

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

或者这张桌子

110
110
110
001
001

最后,一旦完成上述操作,我想将数组中的每个数组转换为一个字符串,该字符串将排除任何非连续 1 的值,例如,如果我转换数组 [1,0,1, 1,1,0,1] 到排除非连续 1 的字符串我应该得到如下内容:111. 请注意,第一个、第二个、第六个和第七个元素被排除在外,因为它们不是连续的 1。

【问题讨论】:

  • \n 没有任何意义,一个错字。
  • 如果排除了第 7 个元素,那么为什么不排除第三个元素,它的前面是 0
  • 如果没有连续的输出,你想要什么输出?当有多组连续的? (例如 [1,1,0,1,1])?

标签: ruby arrays string transpose


【解决方案1】:

对于第一部分,您只需要Array#transpose

array.transpose
#=>  [[1,1,0],[1,1,0],[1,1,0],[0,0,1],[0,0,1]]

那么您可以执行以下操作

.map {|arr| arr.join.scan(/11+/)}

计算连续的。 join 将每个子数组转换为字符串,然后scan 检查两个或多个连续的1s。

总共:

array.transpose.map {|arr| arr.join.scan(/11+/)}
#=> [["11"], ["11"], ["11"], [], []]

如果你想删除空数组,@Doorknob 指出你可以附加一个reject

array.transpose.map {|arr| arr.join.scan(/11+/)}.reject(&:empty?)
#=> [["11"], ["11"], ["11"]]

【讨论】:

  • flatten 去掉了空数组(没有连续的数组),也许是不必要的。
  • 如果有[1,1,0,1,1]呢?然后会有两个单独的字符串。你可能想要.transpose.map {|arr| arr.join.scan(/11+/).join}.reject(&:empty?)
  • @Doorknob 好点。我没有考虑那种情况。我已经更新了我的答案并要求 OP 澄清。
  • 您仍然需要在scan 之后添加.join
  • @Doorknob 可能是,这取决于 OP 想要的输出。我很高兴将其保留为数组数组,并将任何进一步的文本输出作为 OP 的练习 :)
【解决方案2】:

你也可以使用Enumerable#chunk:

代码

array.transpose
     .map { |a|
       a.chunk { |e| e }
        .select { |f,a| f == 1 && a.size > 1 }
        .map { |_,a| a.join } }

示例

array = [[1,1,1,0,0],[1,1,0,1,0],[0,0,1,1,1],[1,1,0,1,1],[1,0,1,1,1]]
  #=> [["11", "11"], ["11"], [], ["1111"], ["111"]]

如果需要,可以消除空集。

说明

对于以上array

a = array.transpose
  #=> [[1, 1, 0, 1, 1],
  #    [1, 1, 0, 1, 0],
  #    [1, 0, 1, 0, 1],
  #    [0, 1, 1, 1, 1],
  #    [0, 0, 1, 1, 1]]

a.map 迭代a 的元素(行)。考虑第一个元素:

b = a.first
  #=> [1, 1, 0, 1, 1]
c = b.chunk { |e| e }
  #=> #<Enumerator: #<Enumerator::Generator:0x000001020495e0>:each>

要查看此枚举器的内容,请添加.to_a

  b.chunk { |e| e }.to_a
    #=> [[1, [1, 1]], [0, [0]], [1, [1, 1]]]
d = c.select { |f,a| f == 1 && a.size > 1 }
  #=> [[1, [1, 1]], [1, [1, 1]]]
d.map { |_,a| a.join }
  #=> ["11", "11"]

【讨论】:

    猜你喜欢
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 2020-12-27
    • 2021-08-06
    • 2010-09-21
    相关资源
    最近更新 更多