সংখ্যার মান অনুসারে একটি রুবি হ্যাশ কীভাবে বাছাই করবেন?


154

আমার একটি কাউন্টার হ্যাশ রয়েছে যা আমি গণনা অনুসারে বাছাই করার চেষ্টা করছি। আমি যে সমস্যাটি চালাচ্ছি তা হ'ল ডিফল্ট হাশ.সোর্ট ফাংশনটি সংখ্যা আকারের পরিবর্তে স্ট্রিংয়ের মতো সংখ্যা সাজায়।

অর্থাত্ হ্যাশ:

metrics = {"sitea.com" => 745, "siteb.com" => 9, "sitec.com" => 10 }

এই কোড চলছে:

metrics.sort {|a1,a2| a2[1]<=>a1[1]}

একটি সাজানো অ্যারে প্রদান করবে:

[ 'siteb.com', 9, 'sitea.com', 745, 'sitec.com', 10]

745 9 এর চেয়ে বড় সংখ্যা হলেও 9 টি তালিকায় প্রথম প্রদর্শিত হবে। শীর্ষস্থানীয় গণনা কে আছে তা দেখানোর চেষ্টা করার সময়, এটি আমার জীবনকে কঠিন করে তুলছে। :)

সংখ্যার মান আকার দ্বারা একটি হ্যাশ (বা একটি অ্যারে এমনকি) কীভাবে বাছাই করতে পারেন তার কোনও ধারণা?

আমি কোন সাহায্যের প্রশংসা করি।


আপনি কি রুবি সংস্করণ ব্যবহার করবেন? আপনার সাজানোর ফলাফল খুব অদ্ভুত
fl00r

উত্তর:


268

আপনি কীভাবে আপনার ফলাফলগুলি পেয়েছেন তা ধারণা নেই, যেহেতু এটি স্ট্রিংয়ের মান অনুসারে বাছাই করে না ... আপনার বিপরীত হওয়া উচিত a1এবং a2আপনার উদাহরণে

যে কোনও ক্ষেত্রে সেরা উপায় (ম্লাদেন অনুসারে):

metrics = {"sitea.com" => 745, "siteb.com" => 9, "sitec.com" => 10 }
metrics.sort_by {|_key, value| value}
  # ==> [["siteb.com", 9], ["sitec.com", 10], ["sitea.com", 745]]

ফলস্বরূপ আপনার যদি হ্যাশ দরকার হয় তবে আপনি ব্যবহার করতে পারেন to_h(রুবি ২.০+ এ)

metrics.sort_by {|_key, value| value}.to_h
  # ==> {"siteb.com" => 9, "sitec.com" => 10, "sitea.com", 745}

84
বা sort_by{|k,v| v}
সোজাভাবে

আমার নম্বরটি একটি স্ট্রিং হিসাবে ফিরে আসছিল, এটি এটি ঠিক করে দিয়েছে .. আমার ক্রমটিতে এ 2 এবং এ 1 ছিল কারণ আমি ফলাফলগুলি প্রতারণামূলক বাছাই করতে চেয়েছিলাম .. যদিও আপনার প্রতিক্রিয়াটির জন্য ধন্যবাদ।
ডাস্টিন এম

এই কারণেই আমি রুবিকে ভালবাসি ... এ জাতীয় সমস্যা অন্য ভাষায় মাথা ব্যথা। এত সহজ
হ্যাডি এলসাহার

18
এলচিন: আপনি ব্যবহার করতে পারেনmetrics.sort_by{ |k, v| v }.reverse.to_h
মার্ক-আন্দ্রে লাফোর্টুন

4
প্রকৃতপক্ষে আরও সহজ: হ্যাশ.সোর্ট_বি (এবং শেষ:) এর তুলনায় ভার্সাম জোড়ের অ্যারে পাওয়ার বিষয়ে একই সতর্কতার সাথে।
গেরি গ্লেসন

84

যেহেতু মানটি সর্বশেষ প্রবেশকরণ, আপনি এটি করতে পারেন:

metrics.sort_by(&:last)

4
এটা সত্যিই দারুন! প্রাক-সংজ্ঞা জন্য কোন রেফারকেন &:last?
তামের শ্ল্যাশ

sort_by(&:last)কার্যকরভাবে জন্য সাধারণভাবে সংক্ষেপে হয় sort_by {|x| x.last} stackoverflow.com/questions/1217088/...
বেনি Cherniavsky-Paskin

14

ইতিমধ্যে উত্তর কিন্তু এখনও। আপনার কোডটি এতে পরিবর্তন করুন:

metrics.sort {|a1,a2| a2[1].to_i <=> a1[1].to_i }

পথে স্ট্রিংগুলিতে রূপান্তরিত হয়েছে বা না, এটি কাজটি করবে।


9

আমি যে আচরণটি দেখছি তা নয়:

irb(main):001:0> metrics = {"sitea.com" => 745, "siteb.com" => 9, "sitec.com" =>
 10 }
=> {"siteb.com"=>9, "sitec.com"=>10, "sitea.com"=>745}
irb(main):002:0> metrics.sort {|a1,a2| a2[1]<=>a1[1]}
=> [["sitea.com", 745], ["sitec.com", 10], ["siteb.com", 9]]

লাইন বরাবর কোথাও আপনার সংখ্যাগুলি স্ট্রিংয়ে রূপান্তরিত করা সম্ভব? আপনি পোস্ট করছেন না এমন আরও কোড আছে?


আহ আপনার অধিকার দেখে মনে হচ্ছে ফলাফলটি আমার কোডটিতে স্ট্রিং হিসাবে ফিরে আসছিল। Pesky ডেটা টাইপ। :) কখনও কখনও আমি সমস্যার খুব কাছাকাছি থাকি। ধন্যবাদ।
ডাস্টিন এম

1
হা. মাঝেমধ্যে শুনি কেউ রুবিকে "টাইপড" বলে উল্লেখ করেছেন। ওহ, না, এটি অবশ্যই টাইপ করা হয়েছে। এটি কেবল স্ট্যাটিকালি টাইপ করা হয়নি। :)
জ্যাকব ম্যাটিসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.