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

Java HashMap - 如何同时获取然后从 HashMap 中删除随机条目?

Java HashMap - 如何同时获取然后从 HashMap 中删除随机条目?

白板的微信 2022-01-12 14:47:08
我想知道是否可以从 HashMap 中获取随机值,然后直接从 HashMap 中删除该键/值?我似乎找不到任何有效的方法,不同的数据结构会更适合这个吗?编辑:我应该更清楚,我生成一个随机数,然后检索与该随机数对应的值。我需要返回该值,然后从地图中删除该条目。
查看完整描述

3 回答

?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

也许Map#computeIfPresent会在你的情况下工作。从其文档中:


如果指定键的值存在且非空,则尝试在给定键及其当前映射值的情况下计算新映射。


如果重新映射函数返回 null,则删除映射。


var map = new HashMap<Integer, String>();


map.put(1, "One");

map.put(2, "Two");

map.put(3, "Three");


map.computeIfPresent(2, (k, v) -> {

    // `v` is equal to "Two"

    return null; // Returning `null` removes the entry from the map.

});


System.out.println(map);

上面的代码输出如下:


{1=One, 3=Three}

如果您要使用 a ConcurrentHashMap,那么这将是一个原子操作。


查看完整回答
反对 回复 2022-01-12
?
慕村225694

TA贡献1880条经验 获得超4个赞

据我了解,问题是这样的:给定一个HashMap你想要

  1. 从当前关联的键中随机选择一个键Map

  2. 从地图中删除该随机选择的键的关联;和

  3. 返回直到最近才与该键关联的值

这是一个如何执行此操作的示例,以及一些小测试/演示例程:

public class Main

{

    private static <K, V> V removeRandomEntry(Map<K, V> map){

        Set<K> keySet = map.keySet();

        List<K> keyList = new ArrayList<>(keySet);

        K keyToRemove = keyList.get((int)(Math.random()*keyList.size()));

        return map.remove(keyToRemove);

    }


    public static void main(String[] args){

        Map<String, String> map = new HashMap<>();

        for(int i = 0; i < 100; ++i)

            map.put("Key" + i, "Value"+i);

        int pass = 0;

        while (!map.isEmpty())

            System.out.println("Pass " + (++pass) + ": Removed: " + removeRandomEntry(map));

    }

}


查看完整回答
反对 回复 2022-01-12
?
aluckdog

TA贡献1847条经验 获得超7个赞

我会这样做:


Hashmap<Integer, Object> example;

int randomNum = ThreadLocalRandom.current().nextInt(0, example.size());

example.getValue() //do something

example.remove(new Integer(randomNum));


查看完整回答
反对 回复 2022-01-12
  • 3 回答
  • 0 关注
  • 303 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号