From 533cb7bbbe5a5bbdbef47f9eb340819d6e43adf1 Mon Sep 17 00:00:00 2001 From: xBLACKICEx Date: Thu, 23 Feb 2023 16:02:13 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat(rust/hashing):=20add=20array?= =?UTF-8?q?=5Fhash=5Fmap=20(#373)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * ✨ feat(rust/hashing): add array_hash_map * 📃 docs(rust/hashing): correct comments --- codes/rust/Cargo.toml | 5 + codes/rust/chapter_hashing/array_hash_map.rs | 111 +++++++++++++++++++ 2 files changed, 116 insertions(+) create mode 100644 codes/rust/chapter_hashing/array_hash_map.rs diff --git a/codes/rust/Cargo.toml b/codes/rust/Cargo.toml index 67d1b3d3e..4fb1198f3 100644 --- a/codes/rust/Cargo.toml +++ b/codes/rust/Cargo.toml @@ -49,6 +49,11 @@ path = "chapter_stack_and_queue/deque.rs" name = "hash_map" path = "chapter_hashing/hash_map.rs" +# Run Command: cargo run --bin array_hash_map +[[bin]] +name = "array_hash_map" +path = "chapter_hashing/array_hash_map.rs" + # Run Command: cargo run --bin binary_search [[bin]] name = "binary_search" diff --git a/codes/rust/chapter_hashing/array_hash_map.rs b/codes/rust/chapter_hashing/array_hash_map.rs new file mode 100644 index 000000000..3cba9b6ef --- /dev/null +++ b/codes/rust/chapter_hashing/array_hash_map.rs @@ -0,0 +1,111 @@ +/** + * File: array_hash_map.rs + * Created Time: 2023-2-18 + * Author: xBLACICEx (xBLACKICEx@outlook.com) + */ + +#[derive(Debug, Clone)] +/* 键值对 int->String */ +pub struct Entry { + pub key: i32, + pub val: String, +} + +/* 基于数组简易实现的哈希表 */ +pub struct ArrayHashMap { bucket: Vec> } + +impl ArrayHashMap { + pub fn new() -> ArrayHashMap { + // 初始化一个长度为 100 的桶(数组) + Self { bucket: vec![None; 100] } + } + + /* 哈希函数 */ + fn hash_func(&self, key: i32) -> usize { + key as usize % 100 + } + + /* 查询操作 */ + pub fn get(&self, key: i32) -> Option<&String> { + let index = self.hash_func(key); + self.bucket[index].as_ref().map(|entry| &entry.val) + } + + /* 添加操作 */ + pub fn put(&mut self, key: i32, val: &str) { + let index = self.hash_func(key); + self.bucket[index] = Some(Entry { + key, + val: val.to_string(), + }); + } + + /* 删除操作 */ + pub fn remove(&mut self, key: i32) { + let index = self.hash_func(key); + self.bucket[index] = None; + } + + /* 获取所有键值对 */ + pub fn entry_set(&self) -> Vec<&Entry> { + self.bucket.iter().filter_map(|entry| entry.as_ref()).collect() + } + + /* 获取所有键 */ + pub fn key_set(&self) -> Vec<&i32> { + self.bucket.iter().filter_map(|entry| entry.as_ref().map(|entry| &entry.key)).collect() + } + + /* 获取所有值 */ + pub fn value_set(&self) -> Vec<&String> { + self.bucket.iter().filter_map(|entry| entry.as_ref().map(|entry| &entry.val)).collect() + } + + /* 打印哈希表 */ + pub fn print(&self) { + for entry in self.entry_set() { + println!("{} -> {}", entry.key, entry.val); + } + } +} + +fn main() { + /* 初始化哈希表 */ + let mut map = ArrayHashMap::new(); + /*添加操作 */ + // 在哈希表中添加键值对(key, value) + map.put(12836, "小哈"); + map.put(15937, "小啰"); + map.put(16750, "小算"); + map.put(13276, "小法"); + map.put(10583, "小鸭"); + println!("\n添加完成后,哈希表为\nKey -> Value"); + map.print(); + + /* 查询操作 */ + // 向哈希表输入键 key ,得到值 value + let name = map.get(15937).unwrap(); + println!("\n输入学号 15937 ,查询到姓名 {}", name); + + /* 删除操作 */ + // 在哈希表中删除键值对 (key, value) + map.remove(10583); + println!("\n删除 10583 后,哈希表为\nKey -> Value"); + map.print(); + + /* 遍历哈希表 */ + println!("\n遍历键值对 Key->Value"); + for entry in map.entry_set() { + println!("{} -> {}", entry.key, entry.val); + } + + println!("\n单独遍历键 Key"); + for key in map.key_set() { + println!("{}", key); + } + + println!("\n单独遍历值 Value"); + for val in map.value_set() { + println!("{}", val); + } +} \ No newline at end of file