c语言从集合中随机选取一个值,从集合中挑选一个随机元素
使用a?ArrayList和a?HashMap:[element - > index]?快速解決Java問題。
動機:我需要一組具有RandomAccess屬性的項目,尤其是從集合中選擇一個隨機項目(參見pollRandom方法)。二叉樹中的隨機導航不準確:樹不是完美平衡的,這不會導致均勻分布。public?class?RandomSet?extends?AbstractSet?{
List?dta?=?new?ArrayList();
Map?idx?=?new?HashMap();
public?RandomSet()?{
}
public?RandomSet(Collection?items)?{
for?(E?item?:?items)?{
idx.put(item,?dta.size());
dta.add(item);
}
}
@Override
public?boolean?add(E?item)?{
if?(idx.containsKey(item))?{
return?false;
}
idx.put(item,?dta.size());
dta.add(item);
return?true;
}
/**
*?Override?element?at?position?id?with?last?element.
*?@param?id
*/
public?E?removeAt(int?id)?{
if?(id?>=?dta.size())?{
return?null;
}
E?res?=?dta.get(id);
idx.remove(res);
E?last?=?dta.remove(dta.size()?-?1);
//?skip?filling?the?hole?if?last?is?removed
if?(id?
idx.put(last,?id);
dta.set(id,?last);
}
return?res;
}
@Override
public?boolean?remove(Object?item)?{
@SuppressWarnings(value?=?"element-type-mismatch")
Integer?id?=?idx.get(item);
if?(id?==?null)?{
return?false;
}
removeAt(id);
return?true;
}
public?E?get(int?i)?{
return?dta.get(i);
}
public?E?pollRandom(Random?rnd)?{
if?(dta.isEmpty())?{
return?null;
}
int?id?=?rnd.nextInt(dta.size());
return?removeAt(id);
}
@Override
public?int?size()?{
return?dta.size();
}
@Override
public?Iterator?iterator()?{
return?dta.iterator();
}}
總結
以上是生活随笔為你收集整理的c语言从集合中随机选取一个值,从集合中挑选一个随机元素的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言怎么往栈中输入元素,C语言栈操作
- 下一篇: 广本缤智使用年限多长?