2017-01-11 13 views
0

Я должен сравнить два файла Excel (с разными данными) и создать две новые таблицы Excel:Удаление записей из Java LinkedHashMap

  1. Таблица 1 содержит все соответствующие записи
  2. Таблица 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(); 

     }    
    } 
} 
+0

Вы пробовали использовать отладчик; или, по крайней мере, добавлять отчеты о трассировке, чтобы реально понять данные, которые вставляются в ваши списки? Видите ли, вы создали довольно сложный код, но без каких-либо входных данных; очень сложно отлаживать то, что происходит. – GhostCat

+1

Предложение: 1. Изолируйте основной код, чтобы он не зависел от материала Excel. 2. Создайте несколько простых примеров тестовых данных. 3. Напишите тест JUnit, который не показывает вашу проблему. – Gustave

ответ

0

AFAIK вы не можете удалить элемент из списка вы итерации на. Я предлагаю вам 2 решения:

  1. итерацию на списки, чтобы проверить на соответствие ключей и хранить матч в третьем списке; затем перейдите по третьему списку и удалите из liste_complete
  2. рефакторируйте первую часть кода вашего вопроса, чтобы сохранить в одном списке соответствующие значения, а в другом - несоответствие. Псевдокод может быть:

    for worksheet1 row 
        for worksheet2 row 
         if(match) 
         liste_matches.add(...) 
         else 
         liste_non_matches.add(...) 
    

    Таким образом, вам не нужно удалять элементы после этого.

+0

Вы можете удалить итерацию, если вы используете «Итератор». – NickL

0

Большое спасибо за ваши советы.

Я уже отлаживал код, но не понял проблему - я думаю, что это действительно была проблема сложных входных данных.

Я не сравнивал ключи с помощью key.getKey(), но только с key, что, по-видимому, вызывает проблемы при сравнении. Во всяком случае, мой код работает с этим фрагментом:

  for(Map.Entry<String,String> keyDelta : liste_Complete.entrySet()){ 

      if(!liste.containsKey(keyDelta.getKey())){ 
       delta_liste.put(String.valueOf(keyDelta), ""); 
      } 
     }