解题思路:
创建hashmap,一个存K,数字,另一个存数字,K,每当插入元素时,将元素非别对应插入两个hashmap中
目的是能够方变随机查找。
public class RandomPool {
public static class Pool<K>{
private HashMap<K,Integer> keyIndexMap;
private HashMap<Integer,K> indexKeyMap;
private int size;
public Pool(){
keyIndexMap = new HashMap<>();
indexKeyMap = new HashMap<>();
size = 0;
}
public void insert(K key){
if(!keyIndexMap.containsKey(key)){
keyIndexMap.put(key,size);
indexKeyMap.put(size++,key);
}
}
// A 0 0 A
// B 1 1 B
//C 2 2 C
//D 3 3 D
//先确定删除的索引,以及最后面的值,把最后面的值补充到删除的地方
//之后删除开始应该删除的
public void delete(K key){
if(keyIndexMap.containsKey(key)){
int deleteIndex = keyIndexMap.get(key);
int lastIndex = --size;
K lastKey = indexKeyMap.get(lastIndex);
keyIndexMap.put(lastKey,deleteIndex);
indexKeyMap.put(deleteIndex,lastKey);
keyIndexMap.remove(key);
indexKeyMap.remove(lastIndex);
}
}
public K random(){
if(size==0){
return null;
}
int num = (int) (Math.random()*size);
return indexKeyMap.get(num);
}
}
}
总结:多积累。