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();

}}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部