从Java LinkedHashMap中删除条目
我必须比较两个Excel文件(数据不同)并创建两个新的Excel表:从Java LinkedHashMap中删除条目,java,iterator,iteration,linkedhashmap,Java,Iterator,Iteration,Linkedhashmap,我必须比较两个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
}
//此代码填充两个映射
LinkedHashMap liste_matches=新LinkedHashMap();
LinkedHashMap liste_complete=新建LinkedHashMap();
while(工作表1.getLastRowNum()>=j){
liste_complete.put(String.valueOf(worksheet1.getRow(j.getCell(18)),“”);
//环路计数器,通过Telekom数据集的环路
int i=1;
while(工作表2.getLastRowNum()>=i)
{
if(String.valueOf(worksheet1.getRow(j).getCell(18))等于(String.valueOf(worksheet2.getRow(i).getCell(9)))
{
如果(!liste_匹配.containsKey(String.valueOf(worksheet1.getRow(j.getCell(18))){
liste_匹配.put(String.valueOf(worksheet1.getRow(j.getCell(18)),“”);
}
}
}
//建立Excel表格
}
这是我用来比较两个列表并从liste_complete中删除liste_匹配中已经存在的所有条目的代码
我第一次尝试了这个(我在第二次尝试时插入了ArrayList…)。它正在运行,但对列表没有任何影响。
ArrayList=新建ArrayList()
for(Map.Entry keyDelta:liste_complete.entrySet())
{
for(Map.Entry键:liste_matches.entrySet()){
if(键增量等于(键)){
列表完成。删除(keyDelta);
list.add(entry.getValue());
}
}
}
后来我尝试了这个,但对列表也没有任何影响:
对于(int c=0;cIterator<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();
}
}
}
Iterator iter=liste_complete.entrySet().Iterator();
while(iter.hasNext()){
Map.Entry=iter.next();
for(Map.Entry键:liste_matches.entrySet()){
if(key.getValue().equalsIgnoreCase(entry.getValue())){
iter.remove();
}
}
}
AFAIK您不能从正在迭代的列表中删除元素。
我向您推荐两种解决方案:
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), "");
}
}
for(Map.Entry keyDelta:liste_Complete.entrySet()){
如果(!liste.containsKey(keyDelta.getKey())){
delta_liste.put(String.valueOf(keyDelta),“”);
}
}
您是否尝试过使用调试器;或者至少添加跟踪语句以实际理解拉入列表的数据?你看,你编写了相当复杂的代码,但没有任何输入数据;调试正在发生的事情非常困难。建议:1。隔离核心代码,使其不依赖于Excel内容。2.创建一些简单的测试数据示例。3.编写一个无法演示问题的JUnit测试。如果使用迭代器
,则可以在迭代时删除。
for(Map.Entry<String,String> keyDelta : liste_Complete.entrySet()){
if(!liste.containsKey(keyDelta.getKey())){
delta_liste.put(String.valueOf(keyDelta), "");
}
}