【问题标题】:Remove entries from Java LinkedHashMap从 Java LinkedHashMap 中删除条目
【发布时间】:2017-05-26 10:03:12
【问题描述】:

我必须比较两个 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

我在 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();

        }               
    }   
}

【问题讨论】:

  • 你试过用调试器吗?或者至少添加跟踪语句以实际理解被拉入列表的数据?你看,你写了一些相当复杂的代码,但没有任何输入数据;很难调试正在发生的事情。
  • 建议: 1. 隔离您的核心代码,使其不依赖于 Excel 内容。 2. 创建一些简单的测试数据示例。 3. 编写一个无法证明您的问题的 JUnit 测试。

标签: java iterator iteration linkedhashmap


【解决方案1】:

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

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

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

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

【讨论】:

  • 如果你使用Iterator,你可以在迭代时删除。
【解决方案2】:

非常感谢您的提示。

我已经调试过代码但不明白问题所在 - 我认为这确实是复杂输入数据的问题。

我没有通过key.getKey() 比较密钥,而是仅通过key 比较密钥,这似乎会导致比较出现问题。无论如何,我的代码使用这个 sn-p 运行:

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

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

【讨论】:

    猜你喜欢
    • 2016-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 2013-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多