使用列表作为缓冲区的 Hashmap
Hashmap using lists as a buffer
我需要创建一个可以为一个键存储多个值的哈希图,我知道多重映射可以做到这一点,但我还需要将这些值列表保持在特定长度。我需要一个每个键来存储 n 个值的列表,这些值是最新的 n 个值,即如果我达到长度 n 并且我添加另一个值,第一个添加的值将从值列表中删除并保持目标长度。
我从下面的代码开始,想更改它以便我可以 store/add 到特定键的列表。
public static void main(final String args[]) throws Exception {
final int maxSize = 4;
final LinkedHashMap<String, String> cache = new LinkedHashMap<String, String>() {
@Override
protected boolean removeEldestEntry(final Map.Entry eldest) {
return size() > maxSize;
}
};
cache.put("A", "A");
System.out.println(cache);
cache.put("B", "A");
System.out.println(cache);
cache.put("C", "A");
System.out.println(cache);
cache.put("D", "A");
System.out.println(cache);
cache.put("E", "A");
System.out.println(cache);
cache.put("F", "A");
System.out.println(cache);
cache.put("G", "A");
}
Output:
{A=A}
{A=A, B=A}
{A=A, B=A, C=A}
{A=A, B=A, C=A, D=A}
{B=A, C=A, D=A, E=A}
{C=A, D=A, E=A, F=A}
I tried changing it to sth like this but can't get it working (python guy here who is getting started with java)
public LinkedHashMap filteroutliers(final String arg, final long arg2) throws Exception{
final int bufferSize = 5;
final LinkedHashMap<Integer, ArrayList<Double>> bufferList = new LinkedHashMap<Integer, ArrayList<Double>>(){
@Override
protected boolean removeEldestEntry(final Map.Entry eldest){
return size() < bufferSize;
}
};
return bufferList;
}
你可以扩展 HashMap 并让你的自定义映射像这样,在这里我维护了一个 queue
来存储键所以当达到限制时你可以删除最早的 key-value 对(FIFO )
class CacheMap<K, V> extends HashMap<K, V> {
private static final long serialVersionUID = 1L;
private int MAX_SIZE;
private Queue<K> queue = new LinkedList<>();
public CacheMap(int capacity) {
super();
MAX_SIZE = capacity;
}
@Override
public V put(K key, V value) {
if (super.size() < MAX_SIZE) {
queue.add(key);
} else {
super.remove(queue.poll());
}
super.put(key, value);
return value;
}
}
}
我需要创建一个可以为一个键存储多个值的哈希图,我知道多重映射可以做到这一点,但我还需要将这些值列表保持在特定长度。我需要一个每个键来存储 n 个值的列表,这些值是最新的 n 个值,即如果我达到长度 n 并且我添加另一个值,第一个添加的值将从值列表中删除并保持目标长度。
我从下面的代码开始,想更改它以便我可以 store/add 到特定键的列表。
public static void main(final String args[]) throws Exception {
final int maxSize = 4;
final LinkedHashMap<String, String> cache = new LinkedHashMap<String, String>() {
@Override
protected boolean removeEldestEntry(final Map.Entry eldest) {
return size() > maxSize;
}
};
cache.put("A", "A");
System.out.println(cache);
cache.put("B", "A");
System.out.println(cache);
cache.put("C", "A");
System.out.println(cache);
cache.put("D", "A");
System.out.println(cache);
cache.put("E", "A");
System.out.println(cache);
cache.put("F", "A");
System.out.println(cache);
cache.put("G", "A");
}
Output:
{A=A}
{A=A, B=A}
{A=A, B=A, C=A}
{A=A, B=A, C=A, D=A}
{B=A, C=A, D=A, E=A}
{C=A, D=A, E=A, F=A}
I tried changing it to sth like this but can't get it working (python guy here who is getting started with java)
public LinkedHashMap filteroutliers(final String arg, final long arg2) throws Exception{
final int bufferSize = 5;
final LinkedHashMap<Integer, ArrayList<Double>> bufferList = new LinkedHashMap<Integer, ArrayList<Double>>(){
@Override
protected boolean removeEldestEntry(final Map.Entry eldest){
return size() < bufferSize;
}
};
return bufferList;
}
你可以扩展 HashMap 并让你的自定义映射像这样,在这里我维护了一个 queue
来存储键所以当达到限制时你可以删除最早的 key-value 对(FIFO )
class CacheMap<K, V> extends HashMap<K, V> {
private static final long serialVersionUID = 1L;
private int MAX_SIZE;
private Queue<K> queue = new LinkedList<>();
public CacheMap(int capacity) {
super();
MAX_SIZE = capacity;
}
@Override
public V put(K key, V value) {
if (super.size() < MAX_SIZE) {
queue.add(key);
} else {
super.remove(queue.poll());
}
super.put(key, value);
return value;
}
}
}