【问题标题】:Printing elements of array in one line in Ruby在Ruby中的一行中打印数组元素
【发布时间】:2019-12-08 08:20:44
【问题描述】:

我有以下 Ruby 哈希:

hash = {
0 => "
===
@@@
@ @
@ @
@ @
@@@
===",
1 => "
=
@
@
@
@
@
="}

我想在控制台的一行中打印出一些哈希值。 为此,我创建了一个包含我想要打印出来的元素的数组:

test = [hash[0], hash[1]]

test1 = [hash[0], hash[0]]

如果我想将test1 打印到控制台,结果应该如下:

======
@@@@@@
@ @@ @
@ @@ @
@ @@ @
@@@@@@
======

如果我想将 `test2 打印到控制台,结果应该是:

====
@@@@
@ @@
@ @@
@ @@
@@@@
====

但是,当我使用putsprint 时,结果总是一个接一个地打印,而不是在同一行。

【问题讨论】:

    标签: arrays ruby hash printing puts


    【解决方案1】:
    a1, a2 = hash.values.map { |s| s[1..-1].split("\n") }
      #=> [["===", "@@@", "@ @", "@ @", "@ @", "@@@", "==="],
      #    ["=", "@", "@", "@", "@", "@", "="]] 
    

    puts a1.zip(a1).map(&:join)
    ======
    @@@@@@
    @ @@ @
    @ @@ @
    @ @@ @
    @@@@@@
    ======
    

    puts a1.zip(a2).map(&:join)
    ====
    @@@@
    @ @@
    @ @@
    @ @@
    @@@@
    ====
    

    注意:

    a1.zip(a1)
      #=> [["===", "==="], ["@@@", "@@@"], ["@ @", "@ @"], ["@ @", "@ @"],
      #    ["@ @", "@ @"], ["@@@", "@@@"], ["===", "==="]]
    
    a1.zip(a2)
      #=> [["===", "="], ["@@@", "@"], ["@ @", "@"], ["@ @", "@"],
      #    ["@ @", "@"], ["@@@", "@"], ["===", "="]] 
    

    s[1..-1],它删除了hash[0]hash[1] 的第一个字符,因为该字符是换行符("\n")。如果将0 => "=== 这两行写成0 =>"===hash[1] 类似),我可以写成s.split("\n")

    【讨论】:

    • 非常感谢您的回答。我已经实现了您的建议,事实上,它们现在正在同一行打印。但是,它们打印时彼此之间有一些空间。你可以在这里看到:drive.google.com/file/d/1udhbQQMqJWs-S7Ze7-byZxdMKRwMJllc/…
    • 我不知道你为什么会得到这个结果。我使用了您的数据 (hash) 和我的代码来产生所需的结果,我将展示出来。首先确认您使用的是问题中给出的哈希hash。如果您还没有这样做,请剪切并粘贴表达式 hash = { ... },然后运行代码。
    • 是的,我使用的是完全相同的哈希值。
    • 当您执行a1, a2 = hash.values.map { |s| s[1..-1].split("\n") } 时,您得到的返回值是否与我的答案中显示的相同?如果你这样做了,你得到的返回值与我为a1.zip(a1) 显示的一样吗?
    【解决方案2】:

    你需要先创建一个二维结构才能得到想要的结果。

    我建议以下步骤:

    1. 解构hash中的值

      atomic = hash.values.map{ |e| e.split("\n")}
      

      这会给你

      [["",
        "===",
        "@@@",
        "@ @",
        "@ @",
        "@ @",
        "@@@",
        "==="
       ], [
        "",
        "=",
        "@",
        "@",
        "@",
        "@",
        "@",
        "="
       ]]
      
    2. 使用新的数据结构构建你需要的输出

      第一种情况:

      test1 = atomic[0].zip(atomic[0]).map(&:join)
      puts test1
      

      =>

      ======
      @@@@@@
      @ @@ @
      @ @@ @
      @ @@ @
      @@@@@@
      ======
      

      第二种情况:

      test2 = atomic[0].zip(atomic[1]).map(&:join)
      

      =>

      ====
      @@@@
      @ @@
      @ @@
      @ @@
      @@@@
      ====
      

    希望对您有所帮助。

    【讨论】:

    • 你的回答好像和我之前的回答一样。我错过了什么吗?
    • 非常感谢您的回答。我已经实现了您的建议,事实上,它们现在正在同一行打印。但是,它们打印时彼此之间有一些空间。你可以在这里看到:drive.google.com/file/d/1udhbQQMqJWs-S7Ze7-byZxdMKRwMJllc/…
    • 嗨@franciscofcosta,我意识到我在发布后找到了相同的解决方案。我认为卡里和我一直在同时输入我们的答案,他只是更快:-)。我看不出这些空间是从哪里来的。对我来说,test1 看起来像这样:["", "======", "@@@@@@", "@ @@ @", "@ @@ @", "@ @@ @", "@@@@@@", "======"](此处没有空格),您能否发布您的test1.inspect,以便我们向后查找问题?
    • 嗨@knugie,感谢您的回复。我刚刚做了test1.inspect,我得到了这个:["", " === ===", " @@@ @@@", " @ @ @ @", " @ @ @ @", " @ @ @ @", " @@@ @@@", " === ==="]。如您所见,它与您所拥有的并不完全相同。我在数组的第二个和最后一个元素中有空格。
    • 我知道现在是什么问题了。在您的原始帖子中,尾随空格已自动删除。这就是为什么卡里和我没有看到他们。我看到了解决这个问题的两个明智的选择。首先,在处理之前删除原始hash 中的尾随空格。其次,strip 每行的尾随空格如下:atomic = hash.values.map{ |e| e.split("\n").map(&:strip)}。这有帮助吗?
    猜你喜欢
    • 2019-04-29
    • 1970-01-01
    • 2017-04-07
    • 2020-09-15
    • 2020-02-24
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多