-1

我有一个用红宝石返回给我的哈希

test_string = "{cat=6,bear=2,mouse=1,tiger=4}"

我需要按数字排序以这种形式获取这些项目的列表。

animals = [cat, tiger, bear, mouse]

我的想法是在 ruby​​ 中对此进行处理,并在 '=' 字符上进行拆分。然后尝试订购它们并放入新列表。在红宝石中有一种简单的方法可以做到这一点吗?示例代码将不胜感激。

4

5 回答 5

7
s = "{cat=6,bear=2,mouse=1,tiger=4}"

a = s.scan(/(\w+)=(\d+)/)
p a.sort_by { |x| x[1].to_i }.reverse.map(&:first)
于 2013-05-29T17:21:55.343 回答
1

不是最优雅的方法,但它有效:

test_string.gsub(/[{}]/, "").split(",").map {|x| x.split("=")}.sort_by {|x| x[1].to_i}.reverse.map {|x| x[0].strip}

于 2013-05-29T17:15:41.147 回答
1
 a = test_string.split('{')[1].split('}').first.split(',')
 # => ["cat=6", "bear=2", "mouse=1", "tiger=4"]
 a.map{|s| s.split('=')}.sort_by{|p| p[1].to_i}.reverse.map(&:first)
 # => ["cat", "tiger", "bear", "mouse"]
于 2013-05-29T17:16:43.527 回答
1

下面的代码应该做到这一点。解释了内联的步骤

test_string.gsub!(/{|}/, "") # Remove the curly braces
array = test_string.split(",") # Split on comma
array1= [] 
array.each {|word|
    array1<<word.split("=") # Create an array of arrays
}
h1 = Hash[*array1.flatten] # Convert Array into Hash
puts h1.keys.sort {|a, b| h1[b] <=> h1[a]} # Print keys of the hash based on sorted values
于 2013-05-29T17:37:10.080 回答
0
test_string = "{cat=6,bear=2,mouse=1,tiger=4}"
Hash[*test_string.scan(/\w+/)].sort_by{|k,v| v.to_i }.map(&:first).reverse
#=> ["cat", "tiger", "bear", "mouse"]
于 2013-05-29T19:11:14.983 回答