Java 通过复合键值从hashmap中删除键

Java 通过复合键值从hashmap中删除键,java,Java,嘿,伙计们目前在从hashmap中删除重复项方面存在问题 一些背景: 我的hashmap的格式是Map CompositeKeyBean的格式为(字符串ID,字符串hashvalue) ValueBean是一个对象 因此,如果我有一个hashmap,其值如下: (ID:1,HashValue:123),Obj1 (ID:1,HashValue:234),Obj1 (ID:1,HashValue:345),Obj1 我需要删除重复的密钥,并且只有具有唯一ID的项。目前我已经想出了这个,但它似乎不

嘿,伙计们目前在从hashmap中删除重复项方面存在问题

一些背景:

我的hashmap的格式是
Map

CompositeKeyBean
的格式为
(字符串ID,字符串hashvalue)

ValueBean
是一个对象

因此,如果我有一个hashmap,其值如下:

(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);
            }
        }
    }
for(Map.Entry:list.entrySet())
{
字符串idvalue=entry.getKey().getCompositeKeyList().get(0);
对于(int i=1;i
如果需要重复的关键点,则可以在填充地图本身时执行以下操作:

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");
}
Map Map=newhashmap();
if(地图容器(“ID”)){
字符串oldValue=map.get(“ID”);
//放入逻辑以合并该值
}否则{
map.put(“ID”、“newValue”);
}

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

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 numberOfInstanceMap=newhashmap()//临时占位符
对于(Map.Entry:list.entrySet())
{
字符串idvalue=entry.getKey().getCompositeKeyList().get(0);
如果(!numberOfInstanceMap.containsKey(idvalue)){
numberOfInstanceMap.put(idvalue,1);//将键初始化为1
}否则{
numberOfInstanceMap.replace(idValue,numberOfInstanceMap.get(idValue)+1);//将1添加到键的现有值
}
}
对于(Map.Entry:list.entrySet())
{
字符串idvalue=entry.getKey().getCompositeKeyList().get(0);
整数i=numberOfInstanceMap.get(idValue);
如果(i>1){//如果密钥存在多次,则删除重复项
list.remove(idValue);
}        
}

通常更好的方法是使用一组已经看到的ID。遍历地图。如果某个ID不在SEED集合中,请添加它。如果是,则从映射中删除条目。您的
CompositeKeyBean
具有
getCompositeKeyList
方法,而不仅仅是以
ID、Hash
的形式。我很确定您的代码没有编译,或者您没有提供完整/正确的描述,CompositeKeyBean包含一个字符串列表。目前,用户将能够为其记录定义标识符,一些记录具有相同的ID,但具有不同的支付值,因此用户将要做的是:将其支付详细信息中其他值的ID和哈希值存储到compositekeybean。getCompositeKeyList()方法只返回整个列表。