美文网首页
Swift LRUCache

Swift LRUCache

作者: Nomo_C | 来源:发表于2020-05-17 13:08 被阅读0次

使用Swift实现的LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。当缓存容量达到上限时,它应该在写入新数据之前删除最久未使用的数据值,从而为新的数据值留出空间。

public class LruCache3<K:Hashable, V> {
    private let capacity: Int
    private var hashMap: [K: ListNode<K, V>]
    private let head: ListNode<K, V>
    private let tail: ListNode<K, V>

    init(_ capacity: Int) {
        self.capacity = capacity
        self.hashMap = [K: ListNode<K, V>]()
        head = ListNode(nil, nil)
        tail = ListNode(nil, nil)
        head.next = tail
        tail.prev = head
    }

    func get(_ key: K) -> V? {
        guard let oldNode = hashMap[key] else {
            return nil
        }
        updateNode(oldNode: oldNode)
        return oldNode.val
    }

    func put(_ key: K, _ value: V) {

        if let oldNode = hashMap[key] {
            oldNode.val = value
            updateNode(oldNode: oldNode)
        } else {
            checkSize()
            let newNode = ListNode(key, value)
            hashMap[key] = newNode
            addAtLast(node: newNode)
        }
    }

    /// 超出容量移除最长没有使用的节点
    func checkSize() {
        if hashMap.count == capacity {
            if let deleteNode = head.next, let key = deleteNode.key {
                hashMap.removeValue(forKey: key)
                delete(node: deleteNode)
            }

        }
    }

    // 移除节点
    private func delete(node: ListNode<K, V>) {
        // 移除
        node.prev?.next = node.next
        node.next?.prev = node.prev
    }

    /// 将最新的添加到最后
    private func addAtLast(node: ListNode<K, V>) {
        let prev = tail.prev
        // 添加到新的位置
        prev?.next = node
        node.prev = prev

        node.next = tail
        tail.prev = node
    }

    private func updateNode(oldNode: ListNode<K, V>) {
        // 更新将节点移动到最后
        delete(node: oldNode)
        addAtLast(node: oldNode)
    }

    private class ListNode<K:Hashable, V> {
        public var val: V?
        public var key: K?
        public var next: ListNode?
        public var prev: ListNode?
        public init(_ key: K?, _ val: V?) {
            self.key = key
            self.val = val
            self.next = nil
        }
    }
}

相关文章

  • Swift LRUCache

    使用Swift实现的LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 pu...

  • LruCache

    LruCache的使用 LruCache部分源码解析 LruCache 利用 LinkedHashMap 的一个特...

  • Android-Glide源码解析

    一、LruCache 要分析Glide的源码,首先就需要分析LruCache。LruCache是基于LinkedH...

  • Java基础_LruCache工作原理

    本文主要从如下节点讲解 LRU算法简介 LruCache的简介 LruCache的代码实操 LruCache的原理...

  • Glide解析(一) - LruCache

    本文介绍的内容有 LruCache算法思想介绍 v4包中LruCache中源码解析 LruCache算法思想介绍 ...

  • (1)LruCache原理分析

    浅析LruCache原理 Android用LruCache(Least recently use Cache 意...

  • Android LruCache解析

    title: LruCache解析date: 2016-03-29tags: LruChche LruCache ...

  • Android缓存(一)内存缓存LruCache

    LruCache LruCache是Android3.1提供的缓存类,并且在v4包提供了该类。LruCache是一...

  • Android缓存原理

    本文主要内容 LruCache使用 LruCache原理 DiskLruCache使用 DiskLruCache原...

  • 面试题

    LruCache原理 LruCache 即最近最少使用内存(Least recently usage cache)...

网友评论

      本文标题:Swift LRUCache

      本文链接:https://www.haomeiwen.com/subject/ihzjohtx.html