gpt4 book ai didi

java - 从 HashMap 中删除特定条目的简短方法

转载 作者:太空宇宙 更新时间:2023-11-04 06:10:42 24 4
gpt4 key购买 nike

我一直在寻找一种简短易读的方法来从 HashMap 中删除条目。具体来说,这是我的方法:

Map<String, HashMap<String, Long>> kitcooldowns = new HashMap<String, HashMap<String, Long>>();


// METHOD TO REMOVE EXPIRED COOLDOWNS FROM HASHMAP

final long currentime = System.currentTimeMillis();
final HashMap<String, HashMap<String, Long>> tmp = new HashMap<String, HashMap<String,Long>>();
for (final Entry<String, HashMap<String, Long>> kits : kitcooldowns.entrySet()) {
final HashMap<String, Long> newitems = new HashMap<String, Long>();
for (final Entry<String, Long> item : kits.getValue().entrySet()) {
if (item.getValue() + getCooldownTime(item.getKey()) > currentime) {
newitems.put(item.getKey(), item.getValue());
}
}
if (newitems.isEmpty() == false) tmp.put(kits.getKey(), newitems);
}

kitcooldowns = tmp;


private long getCooldownTime(final String type) {
switch (type) {
case "CooldownX":
return 3600000;
case "CooldownY":
return 1800000;
default:
return 0L;
}
}

为了简化这一点,这是主要结构:

MAP<NAME OF PLAYER, MAP<TYPE OF COOLDOWN, TIME WHEN USED>>

如果特定的冷却时间已过期,玩家将从 HashMap 中删除。现在,这对我来说似乎是一个困惑的解决方案,我确信有更好的解决方案。

编辑:我的问题是,Java 8 是否有一种高效且干净的方法(如迭代器),它为大多数长方法提供了大量新的单行解决方案。

最佳答案

无需创建单独的 map 。您可以使用Iterator#remove()如果您迭代 map 的 entrySet()values()

for (Iterator<Entry<String, Long>> iter = kitcooldowns.entrySet().iterator(); iter.hasNext();) {
Entry<String, Long> entry = iter.next();
if (entry.getValue() + getCooldownTime(entry.getKey()) > currentime) {
iter.remove();
}
}
<小时/>

OP想知道:

Isn't there any one-line solution with Java 8?

当然可以,但是我强烈警告您不要仅仅因为可以就将所有内容都写成一句台词。请记住,代码的存在是为了供 future 的开发人员阅读,而不是为了尽可能简洁地编写。此外,使用 Iterator#remove() 的代码将使用更少的内存,因为它不必复制映射。使用较少内存的代码最终也可能会更快,因为较少的内存使用会导致较少的 GC(这会消耗 CPU 时间)和较少的 CPU 缓存未命中。

也就是说:

kitcooldowns = kitcooldowns.entrySet().stream()
.filter(entry -> entry.getValue() + getCooldownTime(entry.getKey()) <= currentime)
.collect(Collectors.toMap(Entry::getKey, Entry::getValue));

关于java - 从 HashMap 中删除特定条目的简短方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28775356/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com