2010-07-07 3 views
0

Voici mon problème J'ai une liste de 'System Exceptions' et j'ai besoin de sélectionner des valeurs distinctes dans la liste en fonction de deux clés. Je crée donc un compositeKey et le stocke dans une liste sous la forme d'une chaîne 'key1: key2' Y a-t-il une meilleure approche?Création d'une clé composite pour filtrer les données à l'aide des communs Apache

Collection uniqueExceptions = CollectionUtils.select(allSubareaExceptions, new Predicate(){ 
     private List<String> ids = new ArrayList<String>(); 
     public boolean evaluate(Object obj) { 
      ....domain.Exception ex = (....domain.Exception)obj; 
      String compositeKey = ex.getProcedure().getSubarea().getId() +":"+ex.getProcedure().getId(); 
      if(ids.contains(compositeKey) == false){ 
       ids.add(compositeKey); 
       return true; 
      } 
      return false; 
     }   
    }); 

Répondre

0

Il existe plusieurs options. Vous pouvez créer une liste:

List<String> compositKey = Arrays.asList(getSubareaId(), getProcedureId()); 

Vous pouvez utiliser un AbstractMap.SimpleEntry (1.6 ou version ultérieure uniquement):

SimpleEntry<String, String> compositKey = new SimpleEntry(getSubareaId(), getProcedureId()); 

Vous pouvez créer votre propre implémentation de paire, ou même une classe composite clé.

Le principal risque lié à l'utilisation de la concaténation est que si : est un caractère légal dans les chaînes d'ID, vous pouvez alors obtenir de faux doublons.

0

vous pouvez surcharger equals() dans la classe d'exception pour vérifier le "compositeKey". puis créer un Set sur la liste (set.addAll()) et voilà. Vous avez un ensemble unique d'exceptions

Questions connexes