[英]Remove object from a HashMap that use List as values
private static final Map<TeamType, List<Player>> LIST = new ConcurrentHashMap<>();
如何从列表中删除播放器 object? 我现在的代码是:
for (List<Player> team : LIST.values())
{
if (team.contains(ObjectIWantToRemove))
{
team.remove(ObjectIWantToRemove);
return;
}
}
但我想只用一行来改进。
您是否希望:
LIST.values().forEach(team -> team.remove(ObjectIWantToRemove));
编辑
这个问题有点不清楚,因为我会提出这个解决方案,所以如果你想从包含它的第一个元素中删除ObjectIWantToRemove
,那么你可以像这样使用 stream :
LIST.values().stream()
.filter(team -> team.contains(ObjectIWantToRemove))
.findFirst()
.ifPresent(team -> team.remove(ObjectIWantToRemove));
你可以做的一件事是:
for (List<Player> team : LIST.values()) {
if (team.remove(ObjectIWantToRemove))
{
return;
}
}
这将避免在删除元素之前调用contains
。
如果你想在一行中完成,你可以这样做:
LIST.values().forEach(team -> team.remove(ObjectIWantToRemove));
这会将玩家从它所属的所有团队中删除,而上面的解决方案仅将其从第一个团队中删除。
如果您正在寻找一种仅从第一个中删除它的解决方案,那么已经有了答案。
尝试这个。
LIST.values().stream().filter(team -> team.remove(ObjectIWantToRemove)).findFirst();
如果团队包含ObjectIWantToRemove
,则 List.remove List.remove(Object)
返回 true。 此表达式仅选择包含ObjectIWantToRemove
的第一个团队。
这使用整数和字符串来演示,但也可以应用于您的类。
LIST.put("A", new ArrayList<>(List.of(1,2,3,4,2,3,1)));
LIST.put("B", new ArrayList<>(List.of(1,2, 9, 10,2)));
LIST.put("C", new ArrayList<>(List.of(1,2,5,2, 9, 1)));
LIST.put("D", new ArrayList<>(List.of(1,3,2,4,2)));
Integer ObjectToRemove = 2;
System.out.println("Before remove");
LIST.entrySet().forEach(System.out::println);
LIST.forEach((k,v)->v.removeIf(r->r.equals(ObjectToRemove)));
System.out.println("After remove");
LIST.entrySet().forEach(System.out::println);
印刷
Before remove
A=[1, 2, 3, 4, 2, 3, 1]
B=[1, 2, 9, 10, 2]
C=[1, 2, 5, 2, 9, 1]
D=[1, 3, 2, 4, 2]
After remove
A=[1, 3, 4, 3, 1]
B=[1, 9, 10]
C=[1, 5, 9, 1]
D=[1, 3, 4]
尽管这会删除所有对象,但我会假设(可能是错误的)一个球员不会为同一支球队列出两次。 如果您只想删除遇到的第一个,请使用此构造。
LIST.forEach((k,v)->v.remove(ObjectToRemove));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.