从Java LinkedHashMap中删除条目

时间:2017-01-11 14:46:12

标签: java iterator iteration linkedhashmap

我必须比较两个Excel文件(使用不同的数据)并创建两个新的Excel表格:

  1. 表1包含所有匹配的条目
  2. 表2包含所有不匹配的条目
  3. 因此,我遍历两个Excel文件并将匹配的条目存储在LinkedHashMap中。在第二个LinkedHashMap中,我存储了Excel文件中的所有条目。有了这两张地图,我想识别三角洲。

    要识别增量,我会比较两个列表,现在想要从完整列表中删除所有条目,如果条目已经在匹配列表的列表中。

    我尝试了不同的解决方案 - 结果是代码正在运行但从未真正删除条目。有人可以帮忙吗?

    继承我的代码:

    // This code fills both Maps
    LinkedHashMap<String, String>  liste_matches = new LinkedHashMap<String, String> ();    
    LinkedHashMap<String, String>  liste_complete = new LinkedHashMap<String, String> ();   
    
    while(worksheet1.getLastRowNum() >= j){
        liste_complete.put(String.valueOf(worksheet1.getRow(j).getCell(18)), "");
    
        // Counter for loop, loops trough Telekom datasets
        int i = 1;
    
        while(worksheet2.getLastRowNum() >= i)
        {       
            if(String.valueOf(worksheet1.getRow(j).getCell(18)).equals(String.valueOf(worksheet2.getRow(i).getCell(9))))
            {
                if(!liste_matches.containsKey(String.valueOf(worksheet1.getRow(j).getCell(18)))){
                    liste_matches.put(String.valueOf(worksheet1.getRow(j).getCell(18)), "");
                }
            }
        }
    
        // build Excel table
    }
    

    这是我用来比较两个列表的代码,并删除了liste_matches中已经存在于liste_matches中的所有条目。

    我第一次尝试了这个(我第二次尝试插入了ArrayList ......)。它正在运行但对列表没有任何影响。     ArrayList list = new ArrayList();

    for(Map.Entry<String,String> keyDelta : liste_complete.entrySet())
    {
        for(Map.Entry<String,String> key : liste_matches.entrySet()){
            if(keyDelta.equals(key)){
                liste_complete.remove(keyDelta);
                list.add(entry.getValue());
            }
        }   
    }
    

    之后我尝试了这个但对List没有任何影响:     for(int c = 0; c&lt; list.size(); c ++)     {         String str = list.get(c);         liste_complete.remove(STR);     }

    我在StackOverflow中找到了这个解决方案,但是返回了java.lang.IllegalStateException

    Iterator<Map.Entry<String,String>> iter = liste_complete.entrySet().iterator();
    while (iter.hasNext()) {
        Map.Entry<String,String> entry = iter.next();
        for(Map.Entry<String,String> key : liste_matches.entrySet()){
            if(key.getValue().equalsIgnoreCase(entry.getValue())){
                iter.remove();
    
            }               
        }   
    }
    

2 个答案:

答案 0 :(得分:0)

AFAIK您无法从正在迭代的列表中删除元素。 我建议你2个解决方案:

  1. 迭代您的列表以检查匹配的密钥并将匹配存储在第三个列表中;然后迭代第三个列表并从liste_complete
  2. 中删除
  3. 重构问题的第一段代码,以便在一个列表中存储匹配的值,在另一个列表中存储不匹配的值。伪代码可能是:

    for worksheet1 row
      for worksheet2 row
          if(match)
             liste_matches.add(...)
          else
             liste_non_matches.add(...)
    

    通过这种方式,您不必在之后删除元素。

答案 1 :(得分:0)

非常感谢您的提示。

我已经调试了代码,但没有理解这个问题 - 我认为这确实是复杂输入数据的问题。

我没有通过key.getKey()比较密钥,只是与key进行比较,这似乎会导致比较出现问题。无论如何,我的代码使用此代码段运行:

            for(Map.Entry<String,String> keyDelta : liste_Complete.entrySet()){

            if(!liste.containsKey(keyDelta.getKey())){
                delta_liste.put(String.valueOf(keyDelta), "");
            }
        }