[英]How to modify HashMaps according to values
假设我有一个HashMap<String, Integer>
包含用户名及其在队列或行中作为 int 的位置。 我将如何从队列中删除用户并随后更新后面用户的所有值?
我找到了一种我认为应该可行的方法。 @Rias,感谢对并发 hashMaps 的指导,它提供了一种完成我面临的相同任务的方法。
public void removeFromQueue(String user) {
if (queueMap.containsKey(user)) {
int userPlace = queueMap.get(user);
for (String currentser : queueMap.keySet()) {
if (queueMap.get(currentUser) > userPlace) {
queueMap.put(user, queueMap.get(currentUser) - 1);
}
}
}
}
自我回答可以改进。 最明显的是,当不需要时(因为我们正在迭代),您正在为每个条目进行两次地图查找。 现在还有方便的Map.replaceAll
方法。 所以也许:
public void removeFromQueue(String user) {
Integer userPlace = queueMap.get(user);
if (userPlace != null) {
queueMap.replaceAll((k, v) -> v>userPlace ? v-1 : v);
}
}
你可以这样做:
import java.util.LinkedHashMap;
import java.util.Map;
public class Main {
static Map<String, Integer> queueMap = new LinkedHashMap<String, Integer>();
public static void main(String[] args) {
queueMap.put("Arvind", 5);
queueMap.put("Avinash", 6);
queueMap.put("Kumar", 7);
queueMap.put("Lightcaster", 8);
queueMap.put("Stackoverflow", 9);
System.out.println("Before: " + queueMap);
removeFromQueue("Kumar");
System.out.println("After: " + queueMap);
}
static void removeFromQueue(String user) {
final Integer userPlace = queueMap.get(user);
if (userPlace != null) {
queueMap.replaceAll((k, v) -> v > userPlace ? v - 1 : v);
queueMap.remove(user);
}
}
}
输出:
Before: {Arvind=5, Avinash=6, Kumar=7, Lightcaster=8, Stackoverflow=9}
After: {Arvind=5, Avinash=6, Lightcaster=7, Stackoverflow=8}
我希望我没有遗漏任何东西,为什么不能对所有用户名使用简单的ArrayList<String>
?
该列表将按用户的索引排序,这相当于您地图中的值。 此外,如果您删除其索引为i
的用户,则所有具有 index > i
的用户将根据需要进行重组(删除后,索引为i + 1
的用户的新索引将为i
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.