2017-01-11 1 views
0

je dois comparer deux fichiers Excel (avec des données différentes) et de créer deux nouvelles tables Excel:Supprimer les entrées de Java LinkedHashMap

  1. Le tableau 1 contient toutes les entrées correspondant à
  2. Le tableau 2 contient toutes les entrées qui correspondent à pas

Par conséquent, je parcourir sur les deux fichiers Excel et stocker les entrées correspondantes dans un LinkedHashMap. Dans un deuxième LinkedHashMap je stocke toutes les entrées du fichier Excel. Avec ces deux cartes, je veux identifier le delta.

Pour identifier le delta, je compare les deux listes et je veux maintenant supprimer toutes les entrées de la liste complète, si l'entrée est déjà dans la liste avec les correspondants.

J'ai essayé différentes solutions - toutes avec le résultat que le code est en cours d'exécution mais jamais une entrée n'est vraiment supprimée. Quelqu'un peut-il aider s'il vous plaît?

Heres mon code:

// 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 
} 

Ceci est mon code, je l'habitude de comparer les deux listes et supprimer toutes les entrées de liste_complete qui sont déjà en liste_matches.

J'ai d'abord essayé ceci (j'ai inséré le ArrayList pour mon deuxième essai ...). Il est en cours d'exécution mais sans aucun effet sur la liste. 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()); 
     } 
    } 
} 

Ensuite j'ai essayé cela, mais aussi sans aucun effet à la liste: for (int c = 0; c < list.size(); C++) { String str = list.get (c) ; liste_complete.remove (str); }

J'ai trouvé cette solution dans StackOverflow, mais qui retourne 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

Avez-vous essayé d'utiliser un débogueur; ou au moins ajouter des instructions de suivi pour comprendre réellement les données qui sont tirées dans vos listes? Vous voyez, vous mettez en place un code assez complexe, mais sans aucune donnée d'entrée; il est très difficile de déboguer ce qui se passe. – GhostCat

+1

Suggestion: 1. Isolez votre code de base afin qu'il n'ait aucune dépendance à l'Excel. 2. Créez un exemple de données de test simple. 3. Ecrivez un test JUnit qui échoue à démontrer votre problème. – Gustave

Répondre

0

AFAIK vous ne pouvez pas supprimer l'élément d'une liste que vous itérer sur. Je vous suggère de 2 solutions:

  1. itérer sur vos listes pour vérifier les clés correspondantes et stocker le match dans la troisième liste; puis itérer sur la troisième liste et supprimer de liste_complete
  2. refactoriser le premier morceau de code de votre question de sorte que vous stockez dans une liste les valeurs correspondantes et dans l'autre le non-correspondant. Le pseudo-code peut être:

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

    De cette manière, vous n'avez pas besoin d'enlever des éléments par la suite.

+0

Vous pouvez supprimer en itérant si vous utilisez un 'Iterator'. – NickL

0

Merci beaucoup pour vos conseils.

J'ai déjà débogué le code mais je n'ai pas compris le problème - je pense que c'était vraiment un problème de données d'entrée complexes.

Je n'ai pas comparé les touches via key.getKey() mais seulement avec key et cela semble causer des problèmes dans la comparaison. Quoi qu'il en soit, mon code s'exécute avec cet extrait:

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

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