java - 从包含键的 LinkedHashMap 中删除特定值和价值 LinkedList
问题描述
我遇到了一个令人头疼的问题,我知道出了什么问题,但无法将其放入代码中。我目前正在研究一个卡片组,我想从LinkedHashMap
. 我到处搜索了针对我非常具体的问题的具体解决方案,但找不到一个。我尝试过使用 entrySet、一个迭代器和一个逻辑解决方案,但该remove()
操作似乎删除了所有记录,而value
忽略了key
. 下面的示例展示了我尝试移除 5 颗红心的尝试。
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map;
public class Main {
public static void main(String[] args) {
Deck deck = new Deck();
System.out.println(deck.deck);
//ENTRYSET
for (Map.Entry<String, LinkedList<String>> entry : deck.deck.entrySet()) {
System.out.println(entry.getValue());
System.out.println(entry.getKey());
if (entry.getKey().contains("5")) {
if (entry.getValue().contains("Hearts")) {
entry.getValue().remove("Hearts");
break;
}
}
}
System.out.println(deck.deck);
//LOGIC SOLUTION
if (! deck.deck.get("5").isEmpty()) {
deck.deck.get("King").remove("Hearts");
}
//ITERATOR
for (Iterator<Map.Entry<String, LinkedList<String>>> it = deck.deck.entrySet().iterator(); it.hasNext(); ) {
Map.Entry<String, LinkedList<String>> entry = it.next();
LinkedList<String> list = entry.getValue();
System.out.println(list);
if (entry.getKey().equals("5")) {
for (int i = 0; i < list.size(); i++) {
if (list.get(i).equals("Hearts")) {
list.remove(i);
break;
}
}
if (list.isEmpty())
it.remove();
}
}
System.out.println(deck.deck);
}
}
输出入口集:
{2=[Clubs, Diamonds, Hearts, Spades], 3=[Clubs, Diamonds, Hearts, Spades], 4=[Clubs, Diamonds, Hearts, Spades], 5=[Clubs, Diamonds, Hearts, Spades], 6=[Clubs, Diamonds, Hearts, Spades], 7=[Clubs, Diamonds, Hearts, Spades], 8=[Clubs, Diamonds, Hearts, Spades], 9=[Clubs, Diamonds, Hearts, Spades], 10=[Clubs, Diamonds, Hearts, Spades], Jack=[Clubs, Diamonds, Hearts, Spades], Queen=[Clubs, Diamonds, Hearts, Spades], King=[Clubs, Diamonds, Hearts, Spades], Ace=[Clubs, Diamonds, Hearts, Spades]}
[Clubs, Diamonds, Hearts, Spades]
2
[Clubs, Diamonds, Hearts, Spades]
3
[Clubs, Diamonds, Hearts, Spades]
4
[Clubs, Diamonds, Hearts, Spades]
5
{2=[Clubs, Diamonds, Spades], 3=[Clubs, Diamonds, Spades], 4=[Clubs, Diamonds, Spades], 5=[Clubs, Diamonds, Spades], 6=[Clubs, Diamonds, Spades], 7=[Clubs, Diamonds, Spades], 8=[Clubs, Diamonds, Spades], 9=[Clubs, Diamonds, Spades], 10=[Clubs, Diamonds, Spades], Jack=[Clubs, Diamonds, Spades], Queen=[Clubs, Diamonds, Spades], King=[Clubs, Diamonds, Spades], Ace=[Clubs, Diamonds, Spades]}
输出逻辑解决方案:
{2=[Clubs, Diamonds, Hearts, Spades], 3=[Clubs, Diamonds, Hearts, Spades], 4=[Clubs, Diamonds, Hearts, Spades], 5=[Clubs, Diamonds, Hearts, Spades], 6=[Clubs, Diamonds, Hearts, Spades], 7=[Clubs, Diamonds, Hearts, Spades], 8=[Clubs, Diamonds, Hearts, Spades], 9=[Clubs, Diamonds, Hearts, Spades], 10=[Clubs, Diamonds, Hearts, Spades], Jack=[Clubs, Diamonds, Hearts, Spades], Queen=[Clubs, Diamonds, Hearts, Spades], King=[Clubs, Diamonds, Hearts, Spades], Ace=[Clubs, Diamonds, Hearts, Spades]}
{2=[Clubs, Diamonds, Spades], 3=[Clubs, Diamonds, Spades], 4=[Clubs, Diamonds, Spades], 5=[Clubs, Diamonds, Spades], 6=[Clubs, Diamonds, Spades], 7=[Clubs, Diamonds, Spades], 8=[Clubs, Diamonds, Spades], 9=[Clubs, Diamonds, Spades], 10=[Clubs, Diamonds, Spades], Jack=[Clubs, Diamonds, Spades], Queen=[Clubs, Diamonds, Spades], King=[Clubs, Diamonds, Spades], Ace=[Clubs, Diamonds, Spades]}
输出迭代器:
{2=[Clubs, Diamonds, Hearts, Spades], 3=[Clubs, Diamonds, Hearts, Spades], 4=[Clubs, Diamonds, Hearts, Spades], 5=[Clubs, Diamonds, Hearts, Spades], 6=[Clubs, Diamonds, Hearts, Spades], 7=[Clubs, Diamonds, Hearts, Spades], 8=[Clubs, Diamonds, Hearts, Spades], 9=[Clubs, Diamonds, Hearts, Spades], 10=[Clubs, Diamonds, Hearts, Spades], Jack=[Clubs, Diamonds, Hearts, Spades], Queen=[Clubs, Diamonds, Hearts, Spades], King=[Clubs, Diamonds, Hearts, Spades], Ace=[Clubs, Diamonds, Hearts, Spades]}
[Clubs, Diamonds, Hearts, Spades]
[Clubs, Diamonds, Hearts, Spades]
[Clubs, Diamonds, Hearts, Spades]
[Clubs, Diamonds, Hearts, Spades]
[Clubs, Diamonds, Spades]
[Clubs, Diamonds, Spades]
[Clubs, Diamonds, Spades]
[Clubs, Diamonds, Spades]
[Clubs, Diamonds, Spades]
[Clubs, Diamonds, Spades]
[Clubs, Diamonds, Spades]
[Clubs, Diamonds, Spades]
[Clubs, Diamonds, Spades]
{2=[Clubs, Diamonds, Spades], 3=[Clubs, Diamonds, Spades], 4=[Clubs, Diamonds, Spades], 5=[Clubs, Diamonds, Spades], 6=[Clubs, Diamonds, Spades], 7=[Clubs, Diamonds, Spades], 8=[Clubs, Diamonds, Spades], 9=[Clubs, Diamonds, Spades], 10=[Clubs, Diamonds, Spades], Jack=[Clubs, Diamonds, Spades], Queen=[Clubs, Diamonds, Spades], King=[Clubs, Diamonds, Spades], Ace=[Clubs, Diamonds, Spades]}
我希望地图包含的内容:
{2=[Clubs, Diamonds, Hearts, Spades], 3=[Clubs, Diamonds, Hearts, Spades], 4=[Clubs, Diamonds, Hearts, Spades], 5=[Clubs, Diamonds, Spades], 6=[Clubs, Diamonds, Hearts, Spades], 7=[Clubs, Diamonds, Hearts, Spades], 8=[Clubs, Diamonds, Hearts, Spades], 9=[Clubs, Diamonds, Hearts, Spades], 10=[Clubs, Diamonds, Hearts, Spades], Jack=[Clubs, Diamonds, Hearts, Spades], Queen=[Clubs, Diamonds, Hearts, Spades], King=[Clubs, Diamonds, Hearts, Spades], Ace=[Clubs, Diamonds, Hearts, Spades]}
那么我将如何指定移除西装的钥匙呢?我不希望删除“Hearts”的所有实例(如本例中)。非常感谢帮助和线索!
编辑:
西装的数量使键指向地图中内存中的一个列表。
前:
public Deck() {
for (int i = 2; i <= 10; i++) {
deck.put(String.valueOf(i), suits));
}
for (int i = 0; i <= 3; i++) {
deck.put(highRank.get(i), suits));
}
}
后:
public Deck() {
for (int i = 2; i <= 10; i++) {
deck.put(String.valueOf(i), new LinkedList<String>(Arrays.asList("Clubs", "Diamonds", "Hearts", "Spades")));
}
for (int i = 0; i <= 3; i++) {
deck.put(highRank.get(i), new LinkedList<String>(Arrays.asList("Clubs", "Diamonds", "Hearts", "Spades")));
}
}
解决方案
问题出在地图人口上,而不是在删除时:
如果您有以下情况:
Map<String, List> myMap = ...
List<String> myList = ...
myMap.put("1", myList);
myMap.put("2", myList);
然后,当您删除时,您将同时从两个地图条目中删除:
myMap.get("1").remove("Hearts"); // removes both from myMap.get("1") and MyMap.get("2")
推荐阅读
- sql - SQL:日期范围之间的重复模式
- apiconnect - IBM API Connect 健康检查
- c# - 使用 Revit API 放置实例时如何考虑 Revit 项目基点位置
- javascript - 如何为firebase实现异步调度云功能?
- numpy - 一次删除多行numpy数组python
- c - 使用 fgetc(stdin) 多次输入后重复打印消息
- wso2 - WSO2 API 管理器 - 无法在配置的 api 发布者中连接安全 websocket (WSS)
- c# - 试图模拟 HttpContext 给我类型问题
- c# - ASP.NET Core:一台主机上一个应用程序的不同实例的不同配置
- c++ - 如何用更宽的虚线绘制现有的虚线?