2026-04-01 15:05:16 +02:00
package ecoparasite.nettoyage ;
2026-04-08 10:42:58 +02:00
import ecoparasite.completion.Completion ;
2026-04-01 15:05:16 +02:00
import ecoparasite.poisson.Poisson ;
2026-04-08 10:42:58 +02:00
import java.util.ArrayList ;
import java.util.Collections ;
2026-04-01 15:05:16 +02:00
import java.util.HashSet ;
2026-04-08 10:42:58 +02:00
import java.util.function.BiConsumer ;
import java.util.function.Function ;
2026-04-01 15:05:16 +02:00
2026-04-01 16:24:42 +02:00
/ * *
* Class Définissant les méthodes statics de Nettoyage des données
* /
2026-04-01 15:05:16 +02:00
public class Nettoyage {
2026-04-08 10:42:58 +02:00
/ *
2026-04-01 16:20:41 +02:00
public static HashSet < Poisson > nettoiePoissonMean ( HashSet < Poisson > tablePoisson ) {
2026-04-01 15:05:16 +02:00
2026-04-08 10:42:58 +02:00
Double mean = Completion . calculateMean ( tablePoisson , Poisson : : getInfestation ) ; //Moyenne
2026-04-01 15:05:16 +02:00
2026-04-08 10:42:58 +02:00
ArrayList < Double > infest = new ArrayList < > ( ) ;
2026-04-01 15:05:16 +02:00
for ( Poisson p : tablePoisson ) {
2026-04-08 10:42:58 +02:00
if ( p . getInfestation ( ) ! = null ) { //Test des valeurs null pour les Tests Unitaires. Je ne devrais pas en avoir.
infest . add ( p . getInfestation ( ) ) ;
2026-04-01 15:05:16 +02:00
}
}
2026-04-08 10:42:58 +02:00
Collections . sort ( infest ) ;
2026-04-01 15:05:16 +02:00
2026-04-08 10:42:58 +02:00
int quartIndex = infest . size ( ) / 4 ;
Double firstQuart = infest . get ( quartIndex ) ;
Double thirdQuart = infest . get ( quartIndex * 3 ) ;
Double IQR = thirdQuart - firstQuart ;
2026-04-01 15:05:16 +02:00
2026-04-08 10:42:58 +02:00
for ( Poisson p : tablePoisson ) {
2026-04-01 15:05:16 +02:00
2026-04-08 10:42:58 +02:00
if ( p . getInfestation ( ) = = null ) {
p . setInfestation ( mean ) ; //Fonction codé en dur pour éviter des problèmes dans les Tests Unitaires : Completion devrais etre fait et valeur null ne devrait pas exister
}
else {
if ( p . getInfestation ( ) < firstQuart - ( IQR * 1 . 5 ) | | p . getInfestation ( ) > thirdQuart + ( IQR * 1 . 5 ) ) {
p . setInfestation ( mean ) ;
}
}
2026-04-01 15:05:16 +02:00
}
2026-04-08 10:42:58 +02:00
return tablePoisson ;
2026-04-01 15:05:16 +02:00
}
2026-04-08 10:42:58 +02:00
* /
2026-04-01 15:05:16 +02:00
2026-04-01 16:24:42 +02:00
/ * *
2026-04-08 10:42:58 +02:00
* Permet de remplacer les valeurs inexistantes 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 .
* @return Le HashSet avec les valeurs remplacés .
* @param < T > Le type de données cobaye . Exemple : Poisson , Population
* @param < V > Le type de la donnée à vérifier , doit être un Wrapper Number . Exemple : Double .
2026-04-01 16:24:42 +02:00
* /
2026-04-08 10:42:58 +02:00
public static < T , V extends Number > HashSet < T > nettoieColumnsMoyenne ( HashSet < T > list , Function < T , V > getValue , BiConsumer < T , V > setValue ) {
2026-04-01 15:05:16 +02:00
2026-04-08 10:42:58 +02:00
Double mean = Completion . calculateMean ( list , getValue ) ;
2026-04-01 15:05:16 +02:00
2026-04-08 10:42:58 +02:00
ArrayList < Double > 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 ( ) ) ;
}
2026-04-01 15:05:16 +02:00
}
2026-04-08 10:42:58 +02:00
Collections . sort ( array ) ;
2026-04-01 15:05:16 +02:00
2026-04-08 10:42:58 +02:00
int quartIndex = array . size ( ) / 4 ;
Double firstQuart = array . get ( quartIndex ) ;
Double thirdQuart = array . get ( quartIndex * 3 ) ;
Double IQR = thirdQuart - firstQuart ;
2026-04-01 15:05:16 +02:00
2026-04-08 10:42:58 +02:00
for ( T item : list ) {
if ( getValue . apply ( item ) . doubleValue ( ) < firstQuart - ( IQR * 1 . 5 ) | | getValue . apply ( item ) . doubleValue ( ) > thirdQuart + ( IQR * 1 . 5 ) ) {
setValue . accept ( item , ( V ) mean ) ;
}
}
2026-04-01 15:05:16 +02:00
2026-04-08 10:42:58 +02:00
return list ;
2026-04-01 15:05:16 +02:00
}
}