{"id":964,"date":"2025-11-10T10:21:00","date_gmt":"2025-11-10T08:21:00","guid":{"rendered":"https:\/\/www.mariusb.net\/blog\/?p=964"},"modified":"2025-11-10T10:21:00","modified_gmt":"2025-11-10T08:21:00","slug":"rust-bytes-group-by-frequency","status":"publish","type":"post","link":"https:\/\/www.mariusb.net\/blog\/2025\/11\/rust-bytes-group-by-frequency\/","title":{"rendered":"Rust Bytes: Group by Frequency"},"content":{"rendered":"<div class=\"wp-block-image\">\n<figure class=\"alignleft size-full is-resized\"><a href=\"https:\/\/i0.wp.com\/www.mariusb.net\/blog\/wp-content\/uploads\/2025\/11\/RB92_Group_by_Frequesncy.png?ssl=1\" rel=\"lightbox[964]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"542\" height=\"610\" src=\"https:\/\/i0.wp.com\/www.mariusb.net\/blog\/wp-content\/uploads\/2025\/11\/RB92_Group_by_Frequesncy.png?resize=542%2C610&#038;ssl=1\" alt=\"\" class=\"wp-image-963\" style=\"width:175px;height:auto\" srcset=\"https:\/\/i0.wp.com\/www.mariusb.net\/blog\/wp-content\/uploads\/2025\/11\/RB92_Group_by_Frequesncy.png?w=542&amp;ssl=1 542w, https:\/\/i0.wp.com\/www.mariusb.net\/blog\/wp-content\/uploads\/2025\/11\/RB92_Group_by_Frequesncy.png?resize=267%2C300&amp;ssl=1 267w\" sizes=\"auto, (max-width: 542px) 100vw, 542px\" \/><\/a><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\">Problem statement:<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Given a list of integers, return a vector of vectors where each inner vector contains all numbers that appear the same number of times, grouped by frequency.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The groups should be ordered by decreasing frequency, and each group\u2019s numbers should be sorted in ascending.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>assert_eq! (group_by_frequency vec! &#91;5, 4, 3, 2, 1]), vec! &#91;vec! &#91;1, 2, 3, 4, 5]l); \nassert_eq! (group_by_frequency vec! &#91;7, 7, 7, 7]), vec! &#91;vec! &#91;711);\nassert_eq! (group_by_frequency vec! &#91;-1, -1, 2, 2, 3]), vec! &#91;vec! &#91;-1, 2], vec! &#91;3]]);\nassert_eq! (group_by_frequency vec! &#91;]), Vec::&lt;Vec&lt;i32&gt;&gt;:: new()) ;<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Solution<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>use std::collections::HashMap;\n\nfn group_by_frequency(nums: Vec&lt;i32>) -> Vec&lt;Vec&lt;i32>> {\n    \/\/ Step 1: Count frequencies using a HashMap\n    let mut freq_map: HashMap&lt;i32, usize> = HashMap::new();\n    for &amp;num in nums.iter() {\n        *freq_map.entry(num).or_insert(0) += 1;\n    }\n    \n    \/\/ Step 2: Create a frequency-to-numbers mapping\n    let mut freq_to_nums: HashMap&lt;usize, Vec&lt;i32>> = HashMap::new();\n    for (&amp;num, &amp;freq) in freq_map.iter() {\n        freq_to_nums.entry(freq)\n            .or_insert_with(Vec::new)\n            .push(num);\n    }\n    \n    \/\/ Step 3: Convert to vector of vectors and sort\n    let mut result: Vec&lt;Vec&lt;i32>> = freq_to_nums\n        .into_iter()\n        .map(|(_, mut nums)| {\n            nums.sort_unstable(); \/\/ Sort numbers within each group nums\n        })\n        .collect();\n    \n    \/\/ Sort groups by frequency (in descending order)\n    result.sort_by_key(|group| {\n        let freq = freq_map.get(&amp;group&#91;0]).unwrap();\n        std::cmp::Reverse(*freq)\n    });\n    \n    result\n}\n\n#&#91;cfg(test)]\nmod tests {\n    use super::*;\n\n    #&#91;test]\n    fn test_all_numbers_appear_once() {\n        assert_eq!(\n            group_by_frequency(vec!&#91;5, 4, 3, 2, 1]),\n            vec!&#91;vec!&#91;1, 2, 3, 4, 5]]\n        );\n    }\n\n    #&#91;test]\n    fn test_all_numbers_same() {\n        assert_eq!(\n            group_by_frequency(vec!&#91;7, 7, 7, 7]),\n            vec!&#91;vec!&#91;7]]\n        );\n    }\n\n    #&#91;test]\n    fn test_mixed_frequencies_with_negative() {\n        assert_eq!(\n            group_by_frequency(vec!&#91;-1, -1, 2, 2, 3]),\n            vec!&#91;vec!&#91;-1, 2], vec!&#91;3]]\n        );\n    }\n\n    #&#91;test]\n    fn test_empty_vector() {\n        assert_eq!(\n            group_by_frequency(vec!&#91;]),\n            Vec::&lt;Vec&lt;i32>>::new()\n        );\n    }\n}\n\nfn main() {\n    \/\/ Example usage\n    let nums = vec!&#91;1, 1, 1, 2, 2, 3];\n    let result = group_by_frequency(nums);\n    println!(\"Result: {:?}\", result);\n}\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Given a list of integers, return a vector of vectors where each inner vector contains all numbers that appear the same number of times, grouped by frequency.<\/p>\n","protected":false},"author":1,"featured_media":963,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"jetpack_seo_schema_type":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":true,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[188],"tags":[189,190],"class_list":["post-964","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-rust","tag-rust","tag-rust_bytes"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/www.mariusb.net\/blog\/wp-content\/uploads\/2025\/11\/RB92_Group_by_Frequesncy.png?fit=542%2C610&ssl=1","jetpack_shortlink":"https:\/\/wp.me\/p1SHVw-fy","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.mariusb.net\/blog\/wp-json\/wp\/v2\/posts\/964","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mariusb.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mariusb.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mariusb.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mariusb.net\/blog\/wp-json\/wp\/v2\/comments?post=964"}],"version-history":[{"count":7,"href":"https:\/\/www.mariusb.net\/blog\/wp-json\/wp\/v2\/posts\/964\/revisions"}],"predecessor-version":[{"id":971,"href":"https:\/\/www.mariusb.net\/blog\/wp-json\/wp\/v2\/posts\/964\/revisions\/971"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mariusb.net\/blog\/wp-json\/wp\/v2\/media\/963"}],"wp:attachment":[{"href":"https:\/\/www.mariusb.net\/blog\/wp-json\/wp\/v2\/media?parent=964"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mariusb.net\/blog\/wp-json\/wp\/v2\/categories?post=964"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mariusb.net\/blog\/wp-json\/wp\/v2\/tags?post=964"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}