我想知道是否有可能从HashMap中获取随机值,然后在从HashMap中删除该键/值之后立即获取?我似乎找不到任何有效的方法,不同的数据结构更适合吗?
编辑: 我应该更加清楚,我生成一个随机数,然后检索与该随机数相对应的值。我需要返回值,然后从地图中删除条目。
答案 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
,您想
Map
中当前关联的键中随机选择一个键; 这是如何执行此操作的示例,以及一些测试/演示例程:
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));
}
}