Я должен сравнить два файла Excel (с разными данными) и создать две новые таблицы Excel:Удаление записей из Java LinkedHashMap
- Таблица 1 содержит все соответствующие записи
- Таблица 2 содержит все записи, которые не совпадают
Поэтому я перебираю файлы Excel и сохраняю соответствующие записи в LinkedHashMap. Во второй LinkedHashMap я храню все записи из файла Excel. С этими двумя Картами я хочу определить дельту.
Для определения дельта я сравниваю оба списка и теперь хочу удалить все записи из полного списка, если запись уже находится в списке с соответствующими.
Я пробовал разные решения - все это привело к тому, что код работает, но никогда не удаляется запись. Может ли кто-нибудь помочь?
Heres мой код:
// 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());
}
}
}
Потом я попробовал это, но и без какого-либо эффекта в списке: для (междунар с = 0; с < list.size(); с ++) { Строка ул = list.get (с) ; 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();
}
}
}
Вы пробовали использовать отладчик; или, по крайней мере, добавлять отчеты о трассировке, чтобы реально понять данные, которые вставляются в ваши списки? Видите ли, вы создали довольно сложный код, но без каких-либо входных данных; очень сложно отлаживать то, что происходит. – GhostCat
Предложение: 1. Изолируйте основной код, чтобы он не зависел от материала Excel. 2. Создайте несколько простых примеров тестовых данных. 3. Напишите тест JUnit, который не показывает вашу проблему. – Gustave