diff --git a/codes/swift/Package.swift b/codes/swift/Package.swift index c20c58f99..3652ac16f 100644 --- a/codes/swift/Package.swift +++ b/codes/swift/Package.swift @@ -20,6 +20,8 @@ let package = Package( .executable(name: "linkedlist_queue", targets: ["linkedlist_queue"]), .executable(name: "array_queue", targets: ["array_queue"]), .executable(name: "deque", targets: ["deque"]), + .executable(name: "hash_map", targets: ["hash_map"]), + .executable(name: "array_hash_map", targets: ["array_hash_map"]), ], targets: [ .target(name: "utils", path: "utils"), @@ -38,5 +40,7 @@ let package = Package( .executableTarget(name: "linkedlist_queue", dependencies: ["utils"], path: "chapter_stack_and_queue", sources: ["linkedlist_queue.swift"]), .executableTarget(name: "array_queue", path: "chapter_stack_and_queue", sources: ["array_queue.swift"]), .executableTarget(name: "deque", path: "chapter_stack_and_queue", sources: ["deque.swift"]), + .executableTarget(name: "hash_map", dependencies: ["utils"], path: "chapter_hashing", sources: ["hash_map.swift"]), + .executableTarget(name: "array_hash_map", path: "chapter_hashing", sources: ["array_hash_map.swift"]), ] ) diff --git a/codes/swift/chapter_hashing/array_hash_map.swift b/codes/swift/chapter_hashing/array_hash_map.swift new file mode 100644 index 000000000..6e3b16a16 --- /dev/null +++ b/codes/swift/chapter_hashing/array_hash_map.swift @@ -0,0 +1,139 @@ +/** + * File: array_hash_map.swift + * Created Time: 2023-01-16 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* 键值对 int->String */ +class Entry { + var key: Int + var val: String + + init(key: Int, val: String) { + self.key = key + self.val = val + } +} + +/* 基于数组简易实现的哈希表 */ +class ArrayHashMap { + private var bucket: [Entry?] = [] + + init() { + // 初始化一个长度为 100 的桶(数组) + for _ in 0 ..< 100 { + bucket.append(nil) + } + } + + /* 哈希函数 */ + private func hashFunc(key: Int) -> Int { + let index = key % 100 + return index + } + + /* 查询操作 */ + func get(key: Int) -> String? { + let index = hashFunc(key: key) + let pair = bucket[index] + return pair?.val + } + + /* 添加操作 */ + func put(key: Int, val: String) { + let pair = Entry(key: key, val: val) + let index = hashFunc(key: key) + bucket[index] = pair + } + + /* 删除操作 */ + func remove(key: Int) { + let index = hashFunc(key: key) + // 置为 nil ,代表删除 + bucket[index] = nil + } + + /* 获取所有键值对 */ + func entrySet() -> [Entry] { + var entrySet: [Entry] = [] + for pair in bucket { + if let pair = pair { + entrySet.append(pair) + } + } + return entrySet + } + + /* 获取所有键 */ + func keySet() -> [Int] { + var keySet: [Int] = [] + for pair in bucket { + if let pair = pair { + keySet.append(pair.key) + } + } + return keySet + } + + /* 获取所有值 */ + func valueSet() -> [String] { + var valueSet: [String] = [] + for pair in bucket { + if let pair = pair { + valueSet.append(pair.val) + } + } + return valueSet + } + + /* 打印哈希表 */ + func print() { + for entry in entrySet() { + Swift.print("\(entry.key) -> \(entry.val)") + } + } +} + +@main +enum _ArrayHashMap { + /* Driver Code */ + static func main() { + /* 初始化哈希表 */ + let map = ArrayHashMap() + + /* 添加操作 */ + // 在哈希表中添加键值对 (key, value) + map.put(key: 12836, val: "小哈") + map.put(key: 15937, val: "小啰") + map.put(key: 16750, val: "小算") + map.put(key: 13276, val: "小法") + map.put(key: 10583, val: "小鸭") + print("\n添加完成后,哈希表为\nKey -> Value") + map.print() + + /* 查询操作 */ + // 向哈希表输入键 key ,得到值 value + let name = map.get(key: 15937)! + print("\n输入学号 15937 ,查询到姓名 \(name)") + + /* 删除操作 */ + // 在哈希表中删除键值对 (key, value) + map.remove(key: 10583) + print("\n删除 10583 后,哈希表为\nKey -> Value") + map.print() + + /* 遍历哈希表 */ + print("\n遍历键值对 Key->Value") + for entry in map.entrySet() { + print("\(entry.key) -> \(entry.val)") + } + print("\n单独遍历键 Key") + for key in map.keySet() { + print(key) + } + print("\n单独遍历值 Value") + for val in map.valueSet() { + print(val) + } + } +} diff --git a/codes/swift/chapter_hashing/hash_map.swift b/codes/swift/chapter_hashing/hash_map.swift new file mode 100644 index 000000000..b74aed3fa --- /dev/null +++ b/codes/swift/chapter_hashing/hash_map.swift @@ -0,0 +1,51 @@ +/** + * File: hash_map.swift + * Created Time: 2023-01-16 + * Author: nuomi1 (nuomi1@qq.com) + */ + +import utils + +@main +enum HashMap { + /* Driver Code */ + static func main() { + /* 初始化哈希表 */ + var map: [Int: String] = [:] + + /* 添加操作 */ + // 在哈希表中添加键值对 (key, value) + map[12836] = "小哈" + map[15937] = "小啰" + map[16750] = "小算" + map[13276] = "小法" + map[10583] = "小鸭" + print("\n添加完成后,哈希表为\nKey -> Value") + PrintUtil.printHashMap(map: map) + + /* 查询操作 */ + // 向哈希表输入键 key ,得到值 value + let name = map[15937]! + print("\n输入学号 15937 ,查询到姓名 \(name)") + + /* 删除操作 */ + // 在哈希表中删除键值对 (key, value) + map.removeValue(forKey: 10583) + print("\n删除 10583 后,哈希表为\nKey -> Value") + PrintUtil.printHashMap(map: map) + + /* 遍历哈希表 */ + print("\n遍历键值对 Key->Value") + for (key, value) in map { + print("\(key) -> \(value)") + } + print("\n单独遍历键 Key") + for key in map.keys { + print(key) + } + print("\n单独遍历值 Value") + for value in map.values { + print(value) + } + } +} diff --git a/codes/swift/utils/PrintUtil.swift b/codes/swift/utils/PrintUtil.swift index cbeab1225..5dc718df8 100644 --- a/codes/swift/utils/PrintUtil.swift +++ b/codes/swift/utils/PrintUtil.swift @@ -68,4 +68,10 @@ public enum PrintUtil { showTrunks(p: p?.prev) print(p!.str, terminator: "") } + + public static func printHashMap(map: [K: V]) { + for (key, value) in map { + print("\(key) -> \(value)") + } + } } diff --git a/docs/chapter_hashing/hash_map.md b/docs/chapter_hashing/hash_map.md index cbb4ba049..f3afdcd57 100644 --- a/docs/chapter_hashing/hash_map.md +++ b/docs/chapter_hashing/hash_map.md @@ -210,7 +210,24 @@ comments: true === "Swift" ```swift title="hash_map.swift" + /* 初始化哈希表 */ + var map: [Int: String] = [:] + + /* 添加操作 */ + // 在哈希表中添加键值对 (key, value) + map[12836] = "小哈" + map[15937] = "小啰" + map[16750] = "小算" + map[13276] = "小法" + map[10583] = "小鸭" + /* 查询操作 */ + // 向哈希表输入键 key ,得到值 value + let name = map[15937]! + + /* 删除操作 */ + // 在哈希表中删除键值对 (key, value) + map.removeValue(forKey: 10583) ``` 遍历哈希表有三种方式,即 **遍历键值对、遍历键、遍历值**。 @@ -348,7 +365,19 @@ comments: true === "Swift" ```swift title="hash_map.swift" - + /* 遍历哈希表 */ + // 遍历键值对 Key->Value + for (key, value) in map { + print("\(key) -> \(value)") + } + // 单独遍历键 Key + for key in map.keys { + print(key) + } + // 单独遍历值 Value + for value in map.values { + print(value) + } ``` ## 哈希函数 @@ -771,7 +800,55 @@ $$ === "Swift" ```swift title="array_hash_map.swift" + /* 键值对 int->String */ + class Entry { + var key: Int + var val: String + + init(key: Int, val: String) { + self.key = key + self.val = val + } + } + + /* 基于数组简易实现的哈希表 */ + class ArrayHashMap { + private var bucket: [Entry?] = [] + + init() { + // 初始化一个长度为 100 的桶(数组) + for _ in 0 ..< 100 { + bucket.append(nil) + } + } + + /* 哈希函数 */ + private func hashFunc(key: Int) -> Int { + let index = key % 100 + return index + } + + /* 查询操作 */ + func get(key: Int) -> String? { + let index = hashFunc(key: key) + let pair = bucket[index] + return pair?.val + } + /* 添加操作 */ + func put(key: Int, val: String) { + let pair = Entry(key: key, val: val) + let index = hashFunc(key: key) + bucket[index] = pair + } + + /* 删除操作 */ + func remove(key: Int) { + let index = hashFunc(key: key) + // 置为 nil ,代表删除 + bucket[index] = nil + } + } ``` ## 哈希冲突