Arrays 要使用Ruby哈希的数组

Arrays 要使用Ruby哈希的数组,arrays,ruby,hash,Arrays,Ruby,Hash,我正在尝试转换此数组: ["dog", 5 , "big house"] 散列: {"dog" => 3 , 5 => 25, "big house" => 9} 该值将是字符串(键)的字符数。 如果它是一个整数(键),那么该值将是2的幂 这是我目前得到的结果,但它只转换字符串(键): 你可以使用这个方法 方法可以判断元素是字符串还是整数 ["dog", 2 , "big house"].inject({}) do |sum, e| if e.is_a? Integer

我正在尝试转换此数组:

["dog", 5 , "big house"]
散列:

{"dog" => 3 , 5 => 25, "big house" => 9}
该值将是字符串(键)的字符数。 如果它是一个整数(键),那么该值将是2的幂

这是我目前得到的结果,但它只转换字符串(键):

你可以使用这个方法

方法可以判断元素是字符串还是整数

["dog", 2 , "big house"].inject({}) do |sum, e|
  if e.is_a? Integer
    sum.merge({e => e*e})
  elsif e.is_a? String
    sum.merge({e => e.length})
  end
end
=> {"dog"=>3, 2=>4, "big house"=>9}
正如@Myst所说,
h[:key]=value
merge
具有更好的性能,因此您也可以这样做:

["dog", 2 , "big house"].inject({}) do |sum, e|
  if e.is_a? Integer
    sum[e] = e*e
  elsif e.is_a? String
    sum[e] = e.length
  end
  sum
end
请记住,对数组调用的
每个
块只向块中抛出一个参数,该块是当前迭代的元素。

您可以使用构造函数将[key,value]对数组转换为哈希。这是另一个选择:

arr = ["dog", 5, "big house"]
result = Hash[ arr.map { |e| [e, e.to_i == e ? e**2 : e.length] } ]
# => {"dog"=>3, 5=>25, "big house"=>9}
自从Ruby 2以来,您可以使用来做同样的事情:

result = arr.map { |e| [e, e.to_i == e ? e**2 : e.length] }.to_h
# => {"dog"=>3, 5=>25, "big house"=>9}

如果您具有以下阵列:

arr = ["dog", 5, "big house"]
首先,您可以创建一个方法,根据元素的类将元素转换为所需的格式:

def convert_to_hash_val(element)
  case element
  when Fixnum
    element**2
  else
    element.size
  end
end
然后创建一个
[element,converted_element]
对数组,并使用函数将其转换为键、值对:

Hash[ arr.map {|element| [element, convert_to_hash_val(element)]} ]
# => { "dog" => 3, 5 => 25, "big house" => 9 }

您可以使用可枚举的#each_with_object方法,如下所示:

array = ["dog",5,"big house"]
array.each_with_object({}) {|x,hash| x.is_a?(String) ? hash[x] = x.length : hash[x] = x**2}
# => {"dog"=>3,5=>25,"big house"=>9}
each_with_对象方法与inject方法非常相似,因此它将遍历数组,完成后将返回新给定的对象。每个\u with\u对象和inject之间的区别在于,每个\u with\u对象都是不可变的,因此不能执行以下操作:

(1..5).each_with_object(0) {|num,sum| sum += num}

它只会返回一个零

“2的力量”——你是指第二力量吗?你的问题是什么?你如何从
2
5=>25
?@pangpang不要改变这个问题。@pangpang你可以,但你不应该这样做。只有OP应该这样做。谢谢你的输入。你是一个女孩吗?这段代码将导致解析错误。考虑将<代码>其他< /COD> > <代码> ELSIF < /代码> .@ MuasasBWA我用Ruby v2.2.2尝试过,它工作得很好。一定是有什么东西变了,因为我希望它也会出错。@iain我错了。只是
否则
条件不会被视为条件。如果为false,请尝试
⏎ 放入“⏎ else将“放入else中”⏎ 把另一个放进去⏎ 结束
。使用此代码创建的对象太多。i、 e.
sum.merge({e=>e.length})
创建一个散列,仅将其与
sum
合并。这意味着每次迭代都要创建一个不必要的散列对象。您应该使用
sum[e]=e.length
。我很抱歉因为这样的原因降低了你的答案,但是这个答案可能会传播坏习惯。
arr= ["dog", 5, "big house"]
two_dimensional_array =  arr.zip(arr.map do |e| 
  case e
  when String then e.length  
  when Integer then e ** 2  
  else raise 'Neither string nor numeric given'  
  end 
end)

my_hash = Hash[*two_dimensional_array.flatten]
array = ["dog",5,"big house"]
array.each_with_object({}) {|x,hash| x.is_a?(String) ? hash[x] = x.length : hash[x] = x**2}
# => {"dog"=>3,5=>25,"big house"=>9}
(1..5).each_with_object(0) {|num,sum| sum += num}
arr= ["dog", 5, "big house"]
two_dimensional_array =  arr.zip(arr.map do |e| 
  case e
  when String then e.length  
  when Integer then e ** 2  
  else raise 'Neither string nor numeric given'  
  end 
end)

my_hash = Hash[*two_dimensional_array.flatten]