![](/img/trans.png)
[英]How to remove the dulpicates from ArrayList<HashMap<String,Object>> in java?
[英]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
}
它可能类似于以下内容(将数组替换为列表以简化使用):
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()
将删除整个条目(键映射到作者列表)。 仅在列表为空时才需要删除它,因此这是一个两步过程:
您应该使用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.