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

时间:2018-11-11 04:44:17

标签: java dictionary hashmap

我想知道是否有可能从HashMap中获取随机值,然后在从HashMap中删除该键/值之后立即获取?我似乎找不到任何有效的方法,不同的数据结构更适合吗?

编辑: 我应该更加清楚,我生成一个随机数,然后检索与该随机数相对应的值。我需要返回值,然后从地图中删除条目。

3 个答案:

答案 0 :(得分:2)

也许Map#computeIfPresent适用于您的情况。从其documentation

  

如果指定键的值存在且不为null,则尝试根据给定键及其当前映射值来计算新映射。

     

如果重新映射函数返回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}

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

答案 1 :(得分:0)

我会这样:

Hashmap<Integer, Object> example;
int randomNum = ThreadLocalRandom.current().nextInt(0, example.size());
example.getValue() //do something
example.remove(new Integer(randomNum));

答案 2 :(得分:0)

据我了解,问题是这样的:给定一个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));
    }
}