繁体   English   中英

从Java LinkedHashMap删除条目

[英]Remove entries from Java LinkedHashMap

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

  1. 表1包含所有匹配的条目
  2. 表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
}

这是我用来比较两个列表并从liste_complete中删除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());
        }
    }   
}

之后,我尝试了此操作,但对列表没有任何影响:for(int c = 0; c <list.size(); c ++){字符串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解决方案:

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

     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), "");
            }
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM