【发布时间】:2017-05-26 10:03:12
【问题描述】:
我必须比较两个 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
}
这是我用来比较两个列表并从 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