package ecoparasite.nettoyage; import ecoparasite.completion.Completion; import ecoparasite.poisson.Poisson; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.function.BiConsumer; import java.util.function.Function; /** * Class Définissant les méthodes statics de Nettoyage des données */ public class Nettoyage { /** * Permet de remplacer les valeurs abérrantes d'un paramètre d'un HashSet par la moyenne des autres valeurs (non nulles). * Exemple d'utilisation : T = Poisson, V = Double, getValue = Poisson::getInfestation, setValue = Poisson::setInfestation. * * @param list La liste de données cobaye. * @param getValue La fonction (Getter) qui permet d'obtenir la valeur que l'on veut vérifier * @param setValue La fonction (Setter) qui permet de remplacer la valeur si null. * @param allowNegative Savoir si une valeur négative est forcément aberrant. * @return Le HashSet avec les valeurs remplacés. * @param Le type de données cobaye. Exemple : Poisson, Population * @param Le type de la donnée à vérifier, doit être un Wrapper Number. Exemple : Double. */ public static HashSet nettoieColumnsMoyenne(HashSet list, Function getValue, BiConsumer setValue, boolean allowNegative ){ Double mean = Completion.calculateMean(list, getValue); ArrayList array = new ArrayList<>(); for ( T item : list) { if (getValue.apply(item)!= null){ //Test des valeurs null pour les Tests Unitaires. Je ne devrais pas en avoir. array.add(getValue.apply(item).doubleValue()); } } Collections.sort(array); int quartIndex = array.size()/4; Double firstQuart = array.get(quartIndex); Double thirdQuart = array.get(quartIndex *3); Double IQR = thirdQuart - firstQuart; for(T item : list){ if( getValue.apply(item).doubleValue() < firstQuart - (IQR * 1.5) || getValue.apply(item).doubleValue() > thirdQuart + (IQR * 1.5) || ( !allowNegative && getValue.apply(item).doubleValue() < 0 ) ){ setValue.accept( item, (V) mean); } } return list; } /** * Polymorphisme de la fonction précédente. Autorise les valeurs abérrantes à être négative. * @param list * @param getValue * @param setValue * @return * @param * @param * * @see Nettoyage::nettoieColumnsMoyenne */ public static HashSet nettoieColumnsMoyenne(HashSet list, Function getValue, BiConsumer setValue){ return nettoieColumnsMoyenne(list, getValue, setValue, true); } }