【问题标题】:Removing specific value from LinkedHashMap containing key <String> and value LinkedList<String>从包含键 <String> 和值 LinkedList<String> 的 LinkedHashMap 中删除特定值
【发布时间】:2018-11-27 01:01:54
【问题描述】:

我遇到了一个令人头疼的问题,我知道哪里出了问题,但无法将其放入代码中。我目前正在研究一个卡片组,我想从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")));
        }

    }

【问题讨论】:

  • 所以从 Deck 中删除 - 好的,但是 Deck 到底是什么?
  • 我的逻辑解决方案适用于这种尝试。 Deck 只是卡片组的一个对象类,我可以在其中执行 Map 数据结构的操作。

标签: java list linked-list hashmap


【解决方案1】:

问题出在地图人口上,而不是在删除时:

如果您有以下情况:

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")

【讨论】:

  • 虽然这不是答案,但提示足以让我完全了解情况。我猜你的解释表明了地图最初的用途,将键映射到内存中的目的地(在我的情况下,它指向内存中的同一个列表)。一旦我意识到这一点,我就知​​道我的地图人口需要键来指向唯一列表,而不是一个列表。解决方案相当简单!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-30
  • 2015-12-05
  • 2017-08-21
  • 1970-01-01
  • 2014-09-06
  • 1970-01-01
相关资源
最近更新 更多