我必须比较两个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_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();
}
}
}
答案 0 :(得分:0)
AFAIK您无法从正在迭代的列表中删除元素。 我建议你2个解决方案:
liste_complete
重构问题的第一段代码,以便在一个列表中存储匹配的值,在另一个列表中存储不匹配的值。伪代码可能是:
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), "");
}
}