mirror of
				https://github.com/krahets/hello-algo.git
				synced 2025-11-04 14:18:20 +08:00 
			
		
		
		
	feat: add Swift codes for hash_map article
This commit is contained in:
		@ -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"]),
 | 
			
		||||
    ]
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										139
									
								
								codes/swift/chapter_hashing/array_hash_map.swift
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										139
									
								
								codes/swift/chapter_hashing/array_hash_map.swift
									
									
									
									
									
										Normal file
									
								
							@ -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)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										51
									
								
								codes/swift/chapter_hashing/hash_map.swift
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								codes/swift/chapter_hashing/hash_map.swift
									
									
									
									
									
										Normal file
									
								
							@ -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)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -68,4 +68,10 @@ public enum PrintUtil {
 | 
			
		||||
        showTrunks(p: p?.prev)
 | 
			
		||||
        print(p!.str, terminator: "")
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static func printHashMap<K, V>(map: [K: V]) {
 | 
			
		||||
        for (key, value) in map {
 | 
			
		||||
            print("\(key) -> \(value)")
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    ```
 | 
			
		||||
 | 
			
		||||
## 哈希冲突
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user