本周做的内容比较少,折腾了一道 LRU 缓存的题目,顺便学习了相关的 LinkedHashMap 数据结构。除此之外看了一篇 RxJava 系列的文章。

Algorithm

题目描述

Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations: get and put.

Example:

> LRUCache cache = new LRUCache( 2 /* capacity */ );
>
> cache.put(1, 1);
> cache.put(2, 2);
> cache.get(1); // returns 1
> cache.put(3, 3); // evicts key 2
> cache.get(2); // returns -1 (not found)
> cache.put(4, 4); // evicts key 1
> cache.get(1); // returns -1 (not found)
> cache.get(3); // returns 3
> cache.get(4); // returns 4
>

设计一个 LRU 缓存,实现 get 以及 put 方法。

方法一

class LRUCache {
private int mCapacity;
private Map<Integer, Integer> mCache;

public LRUCache(int capacity) {
this.mCapacity = capacity;
mCache = new LinkedHashMap();
}

public int get(int key) {
if (mCache.containsKey(key)) {
int newValue = mCache.get(key);
mCache.remove(key);
mCache.put(key, newValue);
return newValue;
} else {
return -1;
}
}

public void put(int key, int value) {
if (mCache.containsKey(key)) {
mCache.remove(key, value);
} else if (mCache.size() >= mCapacity) {
for (int k : lru.keySet()) {
mCache.remove(k);
break;
}
}
mCache.put(key, value);
}
}

方法二

class LRUMap<K, V> extends LinkedHashMap<K, V> {
private int cacheSize ;

public LRUMap(int capacity) {
super(capacity, 0.75f, true) ; //access-based eviction set to 'true' (as opposed to 'insertion'-based eviciton)
cacheSize = capacity ;
}

@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
return size() > cacheSize ;
}
}


public class LRUCache {
LRUMap<Integer, Integer> map ; //use extension of LinkedHashMap here
public LRUCache(int capacity) {
map = new LRUMap<Integer, Integer>(capacity) ; //make sure to pass 'capacity' on to LinkedHashMap ctor
}

public int get(int key) {
if(map.containsKey(key)) {
return map.get(key) ;
}
return -1;
}

public void set(int key, int value) {
map.put(key, value) ;
}
}

Review

  • 本周阅读学习 RxJava系列的文章。主要讲述了判断类型的一些操作:

    • All: 判断传递的所有参数是否满足一定条件,结果是 Bool 类型, 会返回该结果给 onNext() 方法;
    • Amb:会忽略后发事件的 Observable 所有事件传递,而不忽略先发事件的 Observable 对象;
    • Contains:判断传递的所有参数是否包含某一参数,结果是 Bool 类型, 会返回该结果给 onNext() 方法
    • DefaultIfEmpty: 如果 Observable 对象没有传递任何事件或者数据,则传递该默认数据或事件;
    • SequenceEqual:判断两个 Observable 对象传递的参数是否完全一致;
    • SkipUntil: 忽略某个 Observable 对象传递的数据,直到另外一个 Observable 对象开始传数据;
    • SkipWhile:当某条件为 true 时一直忽略传递的参数,直到它为 false 时才开始传递;
    • TakeUntil:和 skipUtil 正好相反;
    • takeWhile:和 SkipWhile 正好相反;

    Exploring RxJava in Android — Conditional and Boolean Operators

Tips

  1. actionbar 中设置自定义view:

    actionbar.setDisplayShowCustomEnabled(true); // 显示自定义view
    actionbar.setDisplayShowTitleEnabled(false); // 不显示原title
    actionbar.setCustomView(view);
  2. bit.getPixel(x, y) 获取 bitmap 中某个像素点的颜色;

Share

线程池没你想的那么简单