Goyave - Comment faire pour supprimer à partir d'une liste, basée sur un prédicat, en gardant une trace de ce qui a été enlevé?
J'ai un ArrayList
à filtrer, et de divers Goyave Predicate
s pour le filtre avec. Cette liste sera que de 50 à 100 éléments.
J'avais l'intention de Iterables.removeIf
à l'aide de chaque prédicat à son tour. C'est peut-être pas au maximum efficace mais jamais l'esprit (au moins removeIf
a certains d'optimisation pour RandomAccess listes)
Pour le débogage, je veux, de façon concise, journal de ce que chaque prédicat n'. par exemple,
Pred0 removed [a, c, g]
Pred1 removed []
Pred2 removed [b, f]
Il y a quelques évident hack des solutions, mais que voulez-vous suggérer que le plus propre?
Pour les points de bonus, il devrait être raisonnablement efficace aussi. 😉
Vous devez vous connecter pour publier un commentaire.
Je capture les éléments supprimés dans votre Prédicat code.
Cela peut être une occasion lors de l'utilisation d'une boucle est plus simple.
Multimap<Predicate, MyType>
rendrait les choses plus concis là aussi.remove
'ing choses à partir d'unArrayList.iterator()
mais je suppose que pas pire dans la pratique, pour ces petite liste de tailles. (J'ai été intéressé de voir qu'il n'existe pas de stratégie personnalisée pourArrayList.iterator().remove()
la façon dont la Goyave n'enIterables.removeIf
).J'aimerais étudier dans observables prédicats. L'idée: à chaque fois, un prédicats
apply
méthode est sur le point de retourner vrai, cela va déclencher une notification aux auditeurs:La
ObservableLogger
est un décorateur pourPredicate
:La
PredicateLogger
besoin d'un constructeur qui ajoute de lui-même en tant qu'auditeur à la prédicats. Il recevra les notifications et cache les prédicats qui a déclenché les événements (laEvent
les besoins de la classe un domaine approprié pour cette information).print
va créer le message de log,reset
va vider les enregistreurs de cache (pour la prochaine course).Je suis d'accord avec Peter anwser.
Mais si vous voulez vous amuser, vous pouvez également envelopper chacun de vos prédicat à l'intérieur d'un prédicat qui serait délégué à la enveloppé de prédicat, et de stocker les valeurs pour lesquelles la valeur true est retourné à l'intérieur d'un
Map<Predicate, List<Foo>> removedByPredicate
:Je suppose que vous avez besoin de:
if (...) return true; else return false;
peut être réduite à...
.