[英]Remove entries from Java LinkedHashMap
我必须比较两个Excel文件(具有不同的数据)并创建两个新的Excel表:
因此,我遍历两个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解决方案:
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), "");
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.