【问题标题】:How to convert numbers in a string, into a hash如何将字符串中的数字转换为哈希
【发布时间】:2018-04-17 16:37:03
【问题描述】:

给定一个字符串,例如"ABCD 100",将其转换为{"ABCD": 100} 的最有效方法是什么,其中"ABCD" 是键,100 是整数和值?

【问题讨论】:

  • 你的字符串总是只用一个空格隔开吗?是只有一个字符串还是可以是一个字符串数组?你可以添加更多信息。
  • “什么是最有效的方法”——在哪方面?
  • @SebastiánPalma,是的 - 字符串由一个空格分隔。
  • @Stefan,从某种意义上说,这是 Ruby 中最惯用的方式(如果有意义的话)。

标签: ruby string hash


【解决方案1】:

假设你有多个键值对,你可以组合spliteach_slicemap

"ABCD 100 EFG 200".split
                  .each_slice(2)
                  .map {|k, v| [k.to_sym, v.to_i]}.to_h
#=> {:ABCD=>100, :EFG=>200}

scan 和群组:

"ABCD 100 EFG 200".scan(/([A-Z]+)\s([0-9]+)/)
                  .map! {|k, v| [k.to_sym, v.to_i]}.to_h
#=> {:ABCD=>100, :EFG=>200}

根据你的实际问题使用正则表达式,这只是一个实例。

【讨论】:

    【解决方案2】:

    如果那是我会做的确切格式

    key, value = "ABCD 100".split
    {key.to_sym => value.to_i}
    

    如果您正在寻找单线

    从 ruby​​ 2.4.0 开始

    ["ABCD 100".split].to_h.each_with_object({}) { |(k, v), memo| memo[k.to_sym] = v.to_i }
    

    来自 ruby​​ 2.4.0

    ["ABCD 100".split].to_h.transform_values!(&:to_i)
    

    【讨论】:

    • transform_values! 在这里更可取。
    • 什么意思?我们没有变量
    • 注意:在 OP 的示例中,密钥应该以 Symbol 结尾,而不是 String
    • 我的意思是改变现有哈希比创建一个新哈希更好。 to_h 之后你已经有一个了,为什么还需要一个?
    • 感谢你们俩。我不知道我是否有一个有效的替代transorm_values! 的密钥:/
    【解决方案3】:

    如果你的模式是像“key value”这样的字符串,你可以使用String#split。它接受一个字符串并返回一个由分隔符分隔的子字符串数组。如果不给分隔符,则默认为空格。

    def insert_values_from_string_into_hash(to_be_parsed_string, hash)
      string_key, value = to_be_parsed_string.split
      hash[string_key] = value
      hash
    end   
    
    insert_values_from_string_into_hash("ABCD 100", {}) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-21
      • 1970-01-01
      • 2020-12-05
      • 2019-03-07
      • 2014-09-24
      • 2014-08-22
      相关资源
      最近更新 更多