import java.util.*;
//设计RandomPool结构
public class RandomPool<V>{
Set<V>set=new LinkedHashSet<>();
//插入值
public void insert(V key)
{
set.add(key);
}
//删除值
public void delete(V key)
{
set.remove(key);
}
//等概论的随机返回一个值
public V getRandom()
{
V Rv=null;
int c=0;
Random rand=new Random(set.size());
c=rand.nextInt(set.size());
//c=(int)(Math.random()*set.size());
//获得返回值
int k=0;
for(V v:set)
{ if(k==c)
{
Rv=v;
break;
}
++k;
}
return Rv;
}
//遍历Set中的所有元素
public void printSet( )
{
Iterator<V>iterator=set.iterator();
while(iterator.hasNext())
{
System.out.print(iterator.next()+" ");
}
System.out.println();
}
public static void main(String[]args)
{
//System.out.println("HelloRandomPool");
RandomPool<Integer>rand=new RandomPool<>();
rand.insert(1);
rand.insert(2);
rand.insert(3);
rand.insert(1);
rand.insert(4);
rand.printSet();
rand.delete(1);
rand.printSet();
System.out.println(rand.getRandom());
}
}
解法二:
import java.util.HashMap;
public class Problem_11_RandomPool {
public static class Pool<K> {
private HashMap<K, Integer> keyIndexMap;
private HashMap<Integer, K> indexKeyMap;
private int size;
public Pool() {
this.keyIndexMap = new HashMap<K, Integer>();
this.indexKeyMap = new HashMap<Integer, K>();
this.size = 0;
}
public void insert(K key) {
if (!this.keyIndexMap.containsKey(key)) {
this.keyIndexMap.put(key, this.size);
this.indexKeyMap.put(this.size++, key);
}
}
public void delete(K key) {
if (this.keyIndexMap.containsKey(key)) {
int deleteIndex = this.keyIndexMap.get(key);
int lastIndex = --this.size;
K lastKey = this.indexKeyMap.get(lastIndex);
this.keyIndexMap.put(lastKey, deleteIndex);
this.indexKeyMap.put(deleteIndex, lastKey);
this.keyIndexMap.remove(key);
this.indexKeyMap.remove(lastIndex);
}
}
public K getRandom() {
if (this.size == 0) {
return null;
}
int randomIndex = (int) (Math.random() * this.size);
return this.indexKeyMap.get(randomIndex);
}
}
public static void main(String[] args) {
Pool<String> pool = new Pool<String>();
pool.insert("zuo");
pool.insert("cheng");
pool.insert("yun");
System.out.println(pool.getRandom());
System.out.println(pool.getRandom());
System.out.println(pool.getRandom());
System.out.println(pool.getRandom());
System.out.println(pool.getRandom());
System.out.println(pool.getRandom());
}
}