【问题标题】:Remove a value from hashmap, if key is empty remove the key as well从 hashmap 中删除一个值,如果 key 为空,则也删除 key
【发布时间】:2015-02-24 04:36:20
【问题描述】:
public NobelPrizeWinners()
{
    winners = new HashMap<Integer, String[]>();

    String[] people = new String[1];
    people[0] = "Barack H. Obama";
    winners.put(new Integer(2009), people);

    people = new String[1];
    people[0] = "Martti Ahtisaari";
    winners.put(new Integer(2008), people);

    people = new String[2];
    people[0] = "Intergovernmental Panel on Climate Change (IPCC)";
    people[1] = "Albert Arnold (Al) Gore Jr.";
    winners.put(new Integer(2007), people);

    people = new String[2];
    people[0] = "Muhammad Yunus";
    people[1] = "Grameen Bank";
    winners.put(new Integer(2006), people);
   }
public void removeWinner(String nameOfWinnerToRemove)
{
    Set<Integer> allYears = winners.keySet();
    for(Integer year : allYears)
    {
        String[] eachYearWinners = winners.get(year);

        for (String winner : eachYearWinners) 
        {
            if(winner.equalsIgnoreCase(nameOfWinnerToRemove))
            {
                winners.remove(year, nameOfWinnerToRemove);

                if(eachYearWinners.length < 1)
                {
                    winners.remove(year);
                }
            }
        }
    }
}

我想删除用户提供的获胜者(nameOfWinnerToRemove),如果没有匹配的名称,则不执行任何操作。并且,如果键为空,则删除键(整数)。 比如,我想在 2009 年删除“Barack H. Obama”,如果这样做,2009 年将出现空白,那么我必须删除 2009。我该如何做到这一点?

【问题讨论】:

  • 它不起作用,还是给你一个异常,因为它可能会运行该代码,因为你不能同时迭代和从实际集合中删除。
  • 这是该玩家的家庭作业在几分钟内第二次出现问题。你确定你应该在作业上作弊吗?
  • 虽然是作业,但我的导师允许在有问题的时候提问。我不知道你提到的那个球员是谁,但那绝对不是我。判断别人时,请确保自己是对的。

标签: java hashmap


【解决方案1】:

重要的是,如果您想在迭代时从集合中删除任何值,请使用集合提供的Iterator

请检查以下代码是否适合您。

public void removeWinner(String nameOfWinnerToRemove)
    {
        Iterator<Integer> iterator  = winners.keySet().iterator();

        //for(Integer year : allYears)
        while(iterator.hasNext())
        {
            Integer year = iterator.next();
            String[] eachYearWinners = winners.get(year);

            for (String winner : eachYearWinners)
            {
                if(winner.equalsIgnoreCase(nameOfWinnerToRemove))
                {

                    //winners.remove(year, nameOfWinnerToRemove); // ??? What is data type of winners I cant find remove method in a map that accepts two parameters
                    if(eachYearWinners.length < 1)
                    {
                        iterator.remove();// You should use Iterators Remove Method when you want to remove key in the iteration
                       // winners.remove(year);
                    }
                }
            }
        }
    }

【讨论】:

  • 非常感谢,但这段代码不像我的代码那样工作。我想要做的是从包含数组的键中删除单个值。我的 hashmap 是 hashmap。我想知道是否可以从键中仅删除一个值。我尝试了winners.values().remove(nameOfWinnerToRemove),但它根本没有删除任何东西。
  • 首先我对这个方法很好奇winners.remove(year, nameOfWinnerToRemove);。你确定你没有任何编译时错误。 winners.remove(year); 也应该导致 concurretModificationException
  • 你想从eachYearWinners array 中删除获胜者的价值吗?那么我认为你应该编辑你的问题,并在提供一些示例地图时说出预期的输出。
猜你喜欢
  • 2017-11-24
  • 2017-04-02
  • 2012-11-13
  • 2013-05-16
  • 2012-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-12
相关资源
最近更新 更多