【问题标题】:Ruby: Building a hash from a string and two array values at a timeRuby:一次从字符串和两个数组值构建散列
【发布时间】:2012-01-10 02:15:24
【问题描述】:

我正在尝试使用以下方法构建哈希:

hash = {}

strings = ["one", "two", "three"]

array = [1, 2, 3, 4, 5, 6]

所以我最终得到:

hash = { "one" => [1, 2] ,
         "two" => [3, 4] ,
         "three" => [5, 6] }

我试过了:

strings.each do |string|
  array.each_slice(2) do |numbers|
    hash[string] = [numbers[0], numbers[1]]
  end
end

但这会产生:

hash = { "one" => [5,6] , "two" => [5,6], "three" => [5,6] }

我知道它为什么这样做(嵌套循环),但我不知道如何实现我想要的。

【问题讨论】:

    标签: ruby hash iteration


    【解决方案1】:

    如果您想要单线:

    hash = Hash[strings.zip(array.each_slice(2))]
    

    例如:

    >> strings = ["one", "two", "three"]
    >> array = [1, 2, 3, 4, 5, 6]
    >> hash = Hash[strings.zip(array.each_slice(2))]
    => {"one"=>[1, 2], "two"=>[3, 4], "three"=>[5, 6]}
    

    【讨论】:

    • +1 正是我要回答的问题,但你打败了我。 :)
    • @mu 太短 以前没用过 zip 方法。这真是太棒了。我爱红宝石。谢谢。
    • @steve_gallagher: Enumerable 是你的朋友,或者至少它想成为。
    【解决方案2】:
    hash = {}
    strings.each { |string| hash[string] = array.slice!(0..1) }
    

    这是一个使用您似乎熟悉的方法和技术的解决方案。这不是“单线”解决方案,但如果您是新手,可能对您来说更容易理解。不过,第一个答案非常优雅。

    【讨论】:

    • strings.each_with_object({}) { |s,h| h[s] = array.shift(2) } 将是类似路线的另一个版本。
    【解决方案3】:

    正如 Mu 所说,Zip 方法是最好的选择:

    将任何参数转换为数组,然后将 self 的元素与每个参数的相应元素合并。这会生成一系列 self.size n 元素数组,其中 n 比参数的数量多一个。如果任何参数的大小小于 enumObj.size,则提供 nil 值。如果给出了一个块,则为每个输出数组调用它,否则返回一个数组数组。

    【讨论】:

      猜你喜欢
      • 2017-12-21
      • 1970-01-01
      • 2017-12-15
      • 2013-08-09
      • 1970-01-01
      • 2011-07-24
      • 2015-12-14
      • 2014-07-06
      • 1970-01-01
      相关资源
      最近更新 更多