Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Java LinkedHashMap中删除条目_Java_Iterator_Iteration_Linkedhashmap - Fatal编程技术网

从Java LinkedHashMap中删除条目

从Java LinkedHashMap中删除条目,java,iterator,iteration,linkedhashmap,Java,Iterator,Iteration,Linkedhashmap,我必须比较两个Excel文件(数据不同)并创建两个新的Excel表: 表1包含所有匹配项 表2包含所有不匹配的条目 因此,我迭代两个Excel文件,并将匹配项存储在LinkedHashMap中。在第二个LinkedHashMap中,我存储Excel文件中的所有条目。通过这两张地图,我想识别三角洲 为了识别增量,我比较了两个列表,现在想从完整列表中删除所有条目,如果条目已经与匹配条目一起在列表中 我尝试了不同的解决方案-所有的结果都是代码正在运行,但从来没有一个条目被真正删除。有人能帮忙吗 这是我

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

  • 表1包含所有匹配项
  • 表2包含所有不匹配的条目
  • 因此,我迭代两个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
    }
    
    //此代码填充两个映射
    LinkedHashMap liste_matches=新LinkedHashMap();
    LinkedHashMap liste_complete=新建LinkedHashMap();
    while(工作表1.getLastRowNum()>=j){
    liste_complete.put(String.valueOf(worksheet1.getRow(j.getCell(18)),“”);
    //环路计数器,通过Telekom数据集的环路
    int i=1;
    while(工作表2.getLastRowNum()>=i)
    {       
    if(String.valueOf(worksheet1.getRow(j).getCell(18))等于(String.valueOf(worksheet2.getRow(i).getCell(9)))
    {
    如果(!liste_匹配.containsKey(String.valueOf(worksheet1.getRow(j.getCell(18))){
    liste_匹配.put(String.valueOf(worksheet1.getRow(j.getCell(18)),“”);
    }
    }
    }
    //建立Excel表格
    }
    
    这是我用来比较两个列表并从liste_complete中删除liste_匹配中已经存在的所有条目的代码

    我第一次尝试了这个(我在第二次尝试时插入了ArrayList…)。它正在运行,但对列表没有任何影响。 ArrayList=新建ArrayList()

    for(Map.Entry keyDelta:liste_complete.entrySet())
    {
    for(Map.Entry键:liste_matches.entrySet()){
    if(键增量等于(键)){
    列表完成。删除(keyDelta);
    list.add(entry.getValue());
    }
    }   
    }
    
    后来我尝试了这个,但对列表也没有任何影响: 对于(int c=0;c 我在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();
    
            }               
        }   
    }
    
    Iterator iter=liste_complete.entrySet().Iterator();
    while(iter.hasNext()){
    Map.Entry=iter.next();
    for(Map.Entry键:liste_matches.entrySet()){
    if(key.getValue().equalsIgnoreCase(entry.getValue())){
    iter.remove();
    }               
    }   
    }
    
    AFAIK您不能从正在迭代的列表中删除元素。 我向您推荐两种解决方案:

  • 在列表上迭代以检查匹配的键,并将匹配项存储在第三个列表中;然后迭代第三个列表并从
    liste_complete
  • 重构问题的第一段代码,以便在一个列表中存储匹配的值,在另一个列表中存储不匹配的值。伪代码可以是:

    for worksheet1 row
      for worksheet2 row
          if(match)
             liste_matches.add(...)
          else
             liste_non_matches.add(...)
    
    这样,以后就不必删除元素了


  • 非常感谢你的提示

    我已经调试了代码,但不理解问题所在——我认为这确实是复杂输入数据的问题

    我没有通过
    key.getKey()
    比较键,而只是通过
    key
    比较键,这似乎会导致比较中出现问题。无论如何,我的代码运行时使用以下代码段:

                for(Map.Entry<String,String> keyDelta : liste_Complete.entrySet()){
    
                if(!liste.containsKey(keyDelta.getKey())){
                    delta_liste.put(String.valueOf(keyDelta), "");
                }
            }
    
    for(Map.Entry keyDelta:liste_Complete.entrySet()){
    如果(!liste.containsKey(keyDelta.getKey())){
    delta_liste.put(String.valueOf(keyDelta),“”);
    }
    }
    
    您是否尝试过使用调试器;或者至少添加跟踪语句以实际理解拉入列表的数据?你看,你编写了相当复杂的代码,但没有任何输入数据;调试正在发生的事情非常困难。建议:1。隔离核心代码,使其不依赖于Excel内容。2.创建一些简单的测试数据示例。3.编写一个无法演示问题的JUnit测试。如果使用
    迭代器
    ,则可以在迭代时删除。
                for(Map.Entry<String,String> keyDelta : liste_Complete.entrySet()){
    
                if(!liste.containsKey(keyDelta.getKey())){
                    delta_liste.put(String.valueOf(keyDelta), "");
                }
            }