2010-10-27 4 views
3

Comment implémenter un prédicat distinct à utiliser avec la méthode Collections Collections.Filter de Google Collections?Google Collections Distinct Predicate

+0

Voulez-vous dire un prédicat qui pourrait être utilisé pour créer une vue filtrée o f une 'Collection' où vous ne voyez que chaque élément distinct de cette collection une fois? – ColinD

+0

Oui, exactement cela. Bien que Michael D points, ce n'est probablement pas possible, car le maintien de l'état n'est pas conseillé. – javacavaj

+0

Oui, j'allais déconseiller si c'était le cas. – ColinD

Répondre

9

Si je vous comprends bien, je ne suis pas sûr que prédicats est la solution ici:

Création d'un prédicat comme ça, il faudrait maintenir une sorte d'état (à savoir: le maintien d'un ensemble de choses qu'il a vu déjà). Ceci est explicitement déconseillé dans le javadoc.

La manière habituelle d'obtenir les éléments distincts d'une collection consiste simplement à les ajouter tous à un ensemble. à savoir:

Set<T> uniqueItems = Sets.newHashSet(collectionWithPotentialDuplicates); 

Si les égaux des méthodes sur <T> ne définissent pas l'unicité de la façon dont vous voulez() et hashCode(), alors vous devriez écrire une méthode utilitaire qui fonctionne sur un Collection<T> et un Function<T, Object> qui retourne les éléments de type T qui sont uniques après avoir été convertis au Function

0

Ma solution:

// Create unique list 
final Set<String> unique = new HashSet<String>(FluentIterable 
               .from(sourceList) 
               .transform(new Function<T, String>() { 
                @Override 
                public String apply(T input) { 
                 // Here we create unique entry 
                 return input.toString(); 
                } 
               }).toSet()); 
// Filter and remove duplicates 
return FluentIterable 
     .from(prePscRowList) 
     .filter(new Predicate<T>() { 
      @Override 
      public boolean apply(T input) { 
       boolean exist = false; 
       if(unique.contains(input.toString())){ 
        unique.remove(input.toString()); 
        exist = true; 
       } 
       return exist; 
      } 
     }).toList(); 
Questions connexes