Ruby初学者在这里。最近碰到了这个问题:
我的朋友约翰和我是“肥胖健身俱乐部(FFC)”的成员。约翰很担心,因为每个月都会公布一份成员权重的列表,每个月他都是列表中的最后一个,这意味着他是最重的。 我是那个建立名单的人所以我告诉他:“别担心,我会修改清单的顺序”。决定将“权重”归因于数字。从现在开始,数字的权重将是其数字的总和。 例如99将具有“权重”18,100将具有“权重”1因此在列表100中将出现在99之前。给定具有正常顺序的FFC成员权重的字符串可以给予该字符串按“权重”排序这些数字?
我试图用以下方法解决这个问题:
def order_weight(strng)
new_strng = strng.split(" ").map! {|x| x.split(//)}.map! {|x| x.reduce {|sum, input| sum.to_i + input.to_i}}
output = strng.split(" ").zip(new_strng)
output.sort_by! {|x, y| [y, x]}
output.reduce("") {|memo, input| memo << input[0] + " "}.chop
end
order_weight("2000 10003 1234000 44444444 9999 11 11 22 123")
#=> "11 11 2000 10003 22 123 1234000 44444444 9999"
这似乎工作正常(如果有更简单的方法请告诉我),但我的问题是我接受:
#<ArgumentError: comparison of Array with Array failed>
我已经阅读了一下,我看到这个问题可以通过将nil值与Enumerable#sort_by进行比较而引起,但据我所知,这不应该是这里的情况(?)
非常感谢任何帮助
答案 0 :(得分:0)
假设成员的权重如下。
weights = { "Bubba"=>302, "Phil"=>139, "Hubert"=>280 }
然后你可以做到以下几点。
puts weights.sort_by { |k,v| v.to_s.each_char.reduce(0) { |t,s| t+s.to_i } }.
map { |a| a.join(" ") }.
join("\n")
# Bubba 302
# Hubert 280
# Phil 139
步骤如下。
a = weights.sort_by { |k,v| v.to_s.each_char.reduce(0) { |t,s| t+s.to_i } }
#=> [["Bubba", 302], ["Hubert", 280], ["Phil", 139]]
b = a.map { |a| a.join(" ") }
#=> ["Bubba 302", "Hubert 280", "Phil 139"]
c = b.join("\n")
#=> "Bubba 302\nHubert 280\nPhil 139"
puts c
# Bubba 302
# Hubert 280
# Phil 139
在计算a
时我们有
enum = weights.sort_by
#=> #<Enumerator: {"Bubba"=>302, "Phil"=>139, "Hubert"=>280}:sort_by>
enum
生成的第一个元素将传递给块,并使用 parallel assignment 分配给块变量。
k, v = enum.next
#=> ["Bubba", 302]
k #=> "Bubba"
v #=> 302
块计算如下。
d = v.to_s
# => "302"
d.each_char.reduce(0) { |t,s| t+s.to_i }
#=> 5
enum
的其余两个元素的计算方法类似。