通过复合键值从哈希映射中删除键



嘿伙计们目前在从哈希图中删除重复项方面遇到问题。

一些背景:

我的哈希图是这种格式的Map<CompositeKeyBean,ValueBean>.

CompositeKeyBean的形式是(String ID, String hashvalue);

ValueBean是一个对象。

因此,如果我有一个带有此类值的哈希图:

(ID:1,HashValue:123),Obj1
(ID:1,HashValue:234),Obj1
(ID:1,HashValue:345),Obj1

我需要删除重复的键,并且只有具有唯一 ID 的项目。 目前我已经想出了这个, 但它似乎不起作用,我很确定我做错了什么。

for (Map.Entry<CompositeKeyBean, ReportDataBean> entry : list.entrySet())
{
String idvalue = entry.getKey().getCompositeKeyList().get(0);
for(int i = 1; i < list.size();i++)
{
if(list.keySet().contains(idvalue))
{
list.remove(i);
}
}
}

我的解决方案是首先声明另一个地图,该地图将用于保存某个键在原始地图中出现的次数。第二次,您可以迭代相同的映射条目集,并使用声明的附加 Map 作为引用删除重复项。

Map<String, Integer> numberOfInstanceMap = new HashMap<String, Integer>(); //temporary placeholder
for (Map.Entry<CompositeKeyBean, ReportDataBean> entry : list.entrySet())
{
String idvalue = entry.getKey().getCompositeKeyList().get(0);
if(!numberOfInstanceMap.containsKey(idvalue)) {
numberOfInstanceMap.put(idvalue, 1); //initialize the key to 1
} else {
numberOfInstanceMap.replace(idValue, numberOfInstanceMap.get(idValue) + 1); //add 1 to the existing value of the key
}
}
for (Map.Entry<CompositeKeyBean, ReportDataBean> entry : list.entrySet())
{
String idvalue = entry.getKey().getCompositeKeyList().get(0);
Integer i = numberOfInstanceMap.get(idValue);
if(i>1) { //remove duplicate if the key exists more than once
list.remove(idValue);
}        
}

如果您期望重复键,则可以在填充地图本身时执行以下操作来处理它:

Map<String, String> map = new HashMap<>();
if(map.containsKey("ID")){
String oldValue = map.get("ID");
//put logic to merge the value
}else{
map.put("ID","newValue");
}

最新更新