2016-12-06 2 views
0

Ruby beginner here。この質問には最近来た:なぜこのコードが原因でしょうか?ArrayとArrayのArrayErrorの比較が失敗しました

私の友人ジョンと私は "Fat to Fit Club(FFC)"のメンバーです。ジョンは、毎月メンバーの加重を含むリストが公開され、毎月彼がリストの最後であることが心配されています。これは彼が最も重いことを意味します。 私はリストを作成したので、私は彼に言った: "もう心配しないで、私はリストの順序を変更する"。 「重み」を数に帰することが決定されました。数字の重みは、今からその数字の合計になります。 たとえば、99は "weight" 18を、100は "weight" 1を持つので、リスト100は99より前に来るでしょう。通常の順序でFFCメンバーの重みを持つ文字列を与えると、 "weights"これらの数字のうち?

私はこの問題を解決しようとした:

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>

私はちょっと読んだことがあります。この問題は、Enumerable#sort_byとnil値を比較することによって発生する可能性があることがわかりましたが、ここではそうではないはずです(?)

すばらしいですご了承ください

+1

例外が報告されるたびに、それが発生した行を含めてください。 'string'がどのように見えるかを示す必要があります。 –

+0

私は含まれているはずの別の情報は、これらの質問が出てくるウェブサイト(コードワー)を介して自分のコードを入力している間だけこのエラーが出るということです。ここに、私がhttp://imgur.com/a/aqRkPを意味するイメージを示す画像があります。 – hellothere1

+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算出において

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 

我々は

enum = weights.sort_by 
    #=> #<Enumerator: {"Bubba"=>302, "Phil"=>139, "Hubert"=>280}:sort_by> 
enum

によって生成された第1の要素は、ブロックに渡され、平行割り当てを用いたブロックの変数に割り当てられています。

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の残りの2つの要素の計算は似ています。

関連する問題