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]