我有一张1993年至2009年诺贝尔奖获得者的哈希地图,关键是年份,价值是一系列获胜者名字。有些年份有一个以上的赢家,没有一年有超过3.我正在尝试一种方法从hashmap中删除一个特定的名称,如果该特定年份只有一个获胜者,则删除密钥。当我尝试这种方法时,它会删除整个键和值,无论当年是否有多个获胜者。 (例如1993年的获奖者是Nelson Mandela和Frederik Willem de Klerk,如果我试图只删除Nelson Mandela,那么1993年的整个条目就不见了)
yourAnnotationArray = mapView.annotations;
答案 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)
它可能类似于以下内容(使用列表替换数组以便更简单地使用):
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
将删除整个条目(将键映射到作者列表)。如果列表为空,则只需删除它,因此这需要两个步骤:
您应该使用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
}
}
}