2016-05-18 24 views
0

sorter.sort_by{|name, user_id| user_id}は機能しません。ハッシュマップソーターはソートされていても、ソートされていないハッシュを出力します。ルビでハッシュを並べ替える

私はハッシュマップに必要な条件と名前とuser_idを追加しています

require 'json' 
class Numeric 
    def to_rad 
     self * Math::PI/180 
    end 
    end 

    def distance(lat2, lon2) 
    lat1=12.9611159 
    lon1=77.6362214 
    dLat = (lat2-lat1).to_rad; 
    dLon = (lon2-lon1).to_rad; 
    a = Math.sin(dLat/2) * Math.sin(dLat/2) + 
     Math.cos(lat1.to_rad) * Math.cos(lat2.to_rad) * 
     Math.sin(dLon/2) * Math.sin(dLon/2); 
    c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
    d = 6371 * c; 
    return d 
    end 

file= File.read('customers.json') 
data_hash= JSON.parse( file) 
sorter = Hash.new 

data_hash["customers"].each do |user| 
    latitude=user["latitude"].to_f 
    longitude=user["longitude"].to_f 
    $count=0 
if (distance(latitude,longitude).to_f < 100.00) 
     name = user["name"] 
     user_id=user["user_id"] 

     sorter[name]=user_id 
     # print name," ",user_id 
     # print "\n" 

    end 
    # 

end 
sorter.sort_by{|name, user_id| user_id}  

print sorter 

答えて

1

sort_by戻りソートされた配列を、それが場所で配列をソートしません。

2.3.0 :001 > x = %w(aa aaa a) 
=> ["aa", "aaa", "a"] 
2.3.0 :003 > x.sort_by { |w| w.size } 
=> ["a", "aa", "aaa"] 
2.3.0 :004 > x 
=> ["aa", "aaa", "a"] 

それはあなたのどちらかが

print sorter.sort_by{|name, user_id| user_id} 

を書く意味したり、ソートされていませんsorter

sorter = sorter.sort_by{|name, user_id| user_id} 
print sorter 
+0

user_idは5と6に結果を再度割り当てる必要があり –

+0

@carletti [[」 10 "]、[リチャード]、[11]、[クリス、12]、[マイケル]、[15]、[イアン]、[16] 「David」、「25」、「Alan」、「31」、「Lisa」、「39」、「Nora」、「5」、「Theresa」、「6」]これは私が得ている出力。 5と6のuser_idが最後に –

+0

と表示されているのを見ることができます。あなたはIDとして文字列を格納していて、 "10"は "6"の前にソートされています。それらをInteger(文字列ではなく)としてソートする場合は、Integerに変換する必要があります。 –

関連する問題