Java HashMap - 如何同时从HashMap中获取并删除一个随机条目?

6
我想知道是否有可能从HashMap中获得一个随机值,然后立即从HashMap中删除该键/值? 我无法找到任何可用的方法,是否有其他数据结构更适合此操作?
编辑:我应该说得更清楚,我生成一个随机数,然后检索与该随机数相对应的值。 我需要返回该值,然后从映射中删除该项。

2
通过简单调用remove(key)函数,将删除具有该键的元素。 - imprezzeb
“随机”条目是什么意思?由谁选择随机条目? - Kevin Anderson
我应该更清楚地表达,我生成一个随机数,然后检索与该随机数对应的值。我需要返回该值,然后从映射中删除该条目。 - JennaTools
使用 HashMap 上的 .keySet 方法获取所有现有键作为 Set;使用键集上的 .toArray 方法获取键的数组。生成介于零和键数组大小之间的随机数;在该索引处获取键 k,并在 HashMap 上使用 .remove(k) - Kevin Anderson
4个回答

4

HashMap中返回并删除键值对的最佳方法是使用remove(key)方法。该方法会删除与key相关联的条目,并返回其对应的值。

Integer randomNumber = new Random().nextInt(10);
Map<Integer, String> map = new HashMap<>();
String valueOfRandomNumberKey = map.remove(randomNumber);

1
无法比这更简单了。 - TriCore

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}

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

3
computeIfPresent 返回新值,而不是旧值。 - Konstantin Svintsov
@KonstantinSvintsov 好的,这与此答案有什么关系? - Jacob G.
3
我认为它没有回答问题。问题是如何通过单个操作(对于同步地图是原子操作?)从映射中获取值并删除该值,computeIfPresent无法做到这一点。 - Konstantin Svintsov
我同意@KonstantinSvintsov的观点。 - Maurice

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接