为了账号安全,请及时绑定邮箱和手机立即绑定

从集合中挑选一个随机元素

/ 猿问

从集合中挑选一个随机元素

从集合中挑选一个随机元素

如何从集合中选择随机元素?我特别感兴趣的是从Java中的HashSet或LinkedHashSet中选择一个随机元素。也欢迎其他语言的解决方案。



查看完整描述

3 回答

?
慕标琳琳

int size = myHashSet.size();

int item = new Random().nextInt(size); // In real life, the Random object should be rather more shared than this

int i = 0;

for(Object obj : myhashSet)

{

    if (i == item)

        return obj;

    i++;

}


查看完整回答
反对 回复 2019-08-17
?
临摹微笑

有点相关你知道吗:

有一些有用的方法java.util.Collections来改组整个集合:Collections.shuffle(List<?>)Collections.shuffle(List<?> list, Random rnd)


查看完整回答
反对 回复 2019-08-17
?
PIPIONE

使用a ArrayList和a HashMap:[element - > index] 快速解决Java问题。

动机:我需要一组具有RandomAccess属性的项目,尤其是从集合中选择一个随机项目(参见pollRandom方法)。二叉树中的随机导航不准确:树不是完美平衡的,这不会导致均匀分布。

public class RandomSet<E> extends AbstractSet<E> {

    List<E> dta = new ArrayList<E>();
    Map<E, Integer> idx = new HashMap<E, Integer>();

    public RandomSet() {
    }

    public RandomSet(Collection<E> 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 <code>id</code> 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 < dta.size()) {
            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<E> iterator() {
        return dta.iterator();
    }}


查看完整回答
反对 回复 2019-08-17

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信