如何从java中的hashmap中删除String数组值?

时间:2016-02-03 09:08:24

标签: java arrays iterator hashmap

我有一张1993年至2009年诺贝尔奖获得者的哈希地图,关键是年份,价值是一系列获胜者名字。有些年份有一个以上的赢家,没有一年有超过3.我正在尝试一种方法从hashmap中删除一个特定的名称,如果该特定年份只有一个获胜者,则删除密钥。当我尝试这种方法时,它会删除整个键和值,无论当年是否有多个获胜者。 (例如1993年的获奖者是Nelson Mandela和Frederik Willem de Klerk,如果我试图只删除Nelson Mandela,那么1993年的整个条目就不见了)

  yourAnnotationArray = mapView.annotations;

5 个答案:

答案 0 :(得分:2)

您正在执行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 :(得分:1)

  1. 创建一个不匹配的获胜者的新数组
  2. 将新阵列设置为新值
  3. 如果数组只有一个元素,则删除键值对。
  4. 它可能类似于以下内容(使用列表替换数组以便更简单地使用):

    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();
            }
        }
    }
    

答案 2 :(得分:1)

简单易用

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

答案 3 :(得分:1)

你的变量&#34;它&#34;指向包含年份密钥和名称列表的每个映射条目。如果你调用it.remove(),你将删除整个地图条目。如果在数组中找到名称,应该怎么做取决于列表中的名称数量。如果有一个名称,那么调用它是正确的。删除()因为它会删除所有内容。否则,我们希望使用map条目的值来保存没有该名称的新数组。

您的代码应如下所示:

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();
            }
        }
    }
}

作为一般规则,我建议您使用List或Collection而不是数组,如果您发现自己必须经常添加或删除对象,只是因为从旧创建一个新数组需要转换为List并且所以你要优化这些步骤。

答案 4 :(得分:0)

AnotherSubfolder是映射条目迭代器,因此it将删除整个条目(将键映射到作者列表)。如果列表为空,则只需删除它,因此这需要两个步骤:

  1. 确定是否需要删除获胜者,如果匹配
  2. ,则将其删除
  3. 每当您从列表中删除获胜者时,请检查是否还需要删除整个条目
  4. 您应该使用it.remove()代替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
            }
        }
    
    }