为什么此代码会导致:Array与Array的ArgumentError比较失败

时间:2016-12-06 04:25:39

标签: ruby sorting enumerable

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进行比较而引起,但据我所知,这不应该是这里的情况(?)

非常感谢任何帮助

1 个答案:

答案 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的其余两个元素的计算方法类似。