繁体   English   中英

如何从Java的哈希图中删除String数组值?

[英]How to remove an String array value from within a hashmap in java?

我有一个1993年至2009年诺贝尔奖获得者的哈希图,关键是年份,值是获奖者姓名的字符串数组。 某些年份的获胜者不止一个,而没有年份的年份不超过3。我正在尝试一种从哈希图中删除特定名称并删除密钥的方法,前提是该特定年份只有一位获胜者。 当我尝试这种方法时,它将删除整个键和值,无论该年是否有多个获胜者。 (例如,1993年的获奖者是纳尔逊·曼德拉和弗雷德里克·威廉·德·克莱克,如果我尝试只删除纳尔逊·曼德拉,那么1993年的全部作品都消失了)

public void removeWinner(String nameOfWinnerToRemove)

    {Iterator <HashMap.Entry<Integer, String[]>> it = winners.entrySet().iterator();
    while(it.hasNext())
    {
        HashMap.Entry<Integer, String[]> entry = it.next();
        for(int i = 0; i < entry.getValue().length; i++)

        {
            if(entry.getValue()[i].equalsIgnoreCase(nameOfWinnerToRemove))
            {
                it.remove();


            }
        }
    }

}

您正在执行it.remove(); 它将从HashMap中删除整个条目(键值对),而不是从值中删除特定的获胜者。

您应该执行以下操作:

if(entry.getValue()[i].equalsIgnoreCase(nameOfWinnerToRemove))
    {
        /* Prepare a new value string without the name you want to remove */
        it.put(/* Key */, /* New Value */); //Doing this will overwrite the entry so you don't have to remove and re-add
    }
  1. 创建一系列新的不匹配赢家
  2. 将新数组设置为新值
  3. 如果数组只有一个元素,则删除键值对。

它可能类似于以下内容(将数组替换为列表以简化使用):

public void removeWinner(String nameOfWinnerToRemove) {
    final Map<String, List<String>> winnerMapping = new HashMap<>();
    final Iterator<Map.Entry<String, List<String>>> iterator = winnerMapping.entrySet().iterator();

    while (iterator.hasNext()) {
        final List<String> winners = iterator.next().getValue();
        final List<String> matchingWinners = new ArrayList<>();

        for (final String winner : winners) {
            if (winner.equalsIgnoreCase(nameOfWinnerToRemove)) {
                matchingWinners.add(winner);
            }
        }

        winners.removeAll(matchingWinners);

        if (winners.size() == 1) {
            iterator.remove();
        }
    }
}

简单使用这个

myMap.get(yourKey).remove(yourValue);

更清晰 :

如果值是字符串List ,这将起作用

 winners.get(entry.getKey()).remove(nameOfWinnerToRemove);

如果值是array

 ArrayUtils.removeElement(winners.get(entry.getKey()), nameOfWinnerToRemove); 

这个it.remove(); 将删除整个键值对

更新:

下载并导入org.apache.commons.lang3

要下载Jar,请访问: http : //www.java2s.com/Code/Jar/c/Downloadcommonlang3jar.htm

您的变量“ it”指向每个包含年份键和名称列表的地图条目。 如果调用它。remove(),则将删除整个地图条目。 如果在数组中找到名称,应该怎么做取决于列表中有多少个名称。 如果有一个名字,那么调用它是正确的。remove()会删除所有内容。 否则,我们希望使用地图条目的值来保存没有该名称的新数组。

您的代码应类似于以下内容:

public void removeWinner(String nameOfWinnerToRemove) {
    Iterator <HashMap.Entry<Integer, String[]>> it = winners.entrySet().iterator();
    while(it.hasNext()) {
        HashMap.Entry<Integer, String[]> entry = it.next();
        List<String> namesList = new ArrayList<String>(Arrays.asList(entry.getValue()));

        // Enter here if found and removed name
        if(namesList.remove(nameOfWinnerToRemove)) {
            if(namesList.size() > 0) {
                // Set array without name
                entry.setValue(namesList.toArray(entry.getValue());
            } else {
                // New list is empty.  Remove entry.
                it.remove();
            }
        }
    }
}

作为一般规则,如果您发现自己不得不经常添加或删除对象,我建议您使用列表或集合而不是数组,这仅仅是因为从旧的数组创建新数组仍然需要转换为列表,所以您d优化这些步骤。

it是地图条目迭代器,因此it.remove()将删除整个条目(键映射到作者列表)。 仅在列表为空时才需要删除它,因此这是一个两步过程:

  1. 确定是否需要删除获胜者,如果匹配则将其删除
  2. 每当您从列表中删除优胜者时,请检查是否还需要删除整个条目

您应该使用List<String>作为获奖者列表,而不是String[] ,因为它更易于操作。

然后,您可以使用这种方法:

public void removeWinner(String nameOfWinnerToRemove) {

    Iterator <HashMap.Entry<Integer, String[]>> it = winners.entrySet().iterator();
    while(it.hasNext()) {
        HashMap.Entry<Integer, String[]> entry = it.next();
        Iterator<String> listIt = entry.getValue().iterator();
        while (listIt.hasNext()) {
            String value = listIt.next();
            if(value.equalsIgnoreCase(nameOfWinnerToRemove)) {
                listIt.remove(); // remove the winner

            }
        }

        if (entry.getValue().isEmpty()) {
            it.remove(); // remove whole entry if empty
        }
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM