IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Supprimer les doublons en prenant l'objet le plus ancien dans une liste Java


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 12
    Par défaut Supprimer les doublons en prenant l'objet le plus ancien dans une liste Java
    Bonjour tout le monde, j'ai besoin de votre aide.Voici mon besoin

    Identification des voyages pour nettoyage dans une liste
    Objectif : supprimer les doublons de FATS en prenant le voyage le plus ancien pour chaque FAT
    Si un FAT a plusieurs voyages, on ne conservera que le voyage le plus ancien : on prendra le voyage qui est survenu sur la date de parcours la plus lointaine.
    Il est possible qu’un FAT ait plusieurs voyages sur cette date de parcours la plus ancienne. A ce moment-là, on prendra le kilométrage voyages le plus faible. Si les kilométrages sont égaux, on n’en conservera qu’un seul incident.
    FAT_1 01/01/2016 1000 A conserver
    FAT_1 02/02/2016 1500 Delete
    FAT_1 03/03/2016 2000 Delete
    FAT_2 01/01/2016 1000 A conserver
    FAT_2 01/01/2016 1010 Delete
    FAT_2 03/03/2016 2000 Delete
    FAT_3 01/01/2016 1000 A conserver
    FAT_3 01/01/2016 1000 Delete
    FAT_3 03/03/2016 2000 Delete


    J'ai essayé avec distinctBy comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
        Set<Object> seen = ConcurrentHashMap.newKeySet();
        return t -> seen.add(keyExtractor.apply(t));
    }
    en appelant cette fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     private List<VoyageBean> getVoyagesFails(@NonNull List<VoyageBean> voyagesInitList) {        
     
    return voyagesInitList.stream()
                    .filter(Utils.distinctByKey(VoyageBean::getFat))
                    .collect(Collectors.toList());
    ça ne marche pas.

    Merci par avance pour votre aide,

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Je ne sais pas ce que tu essayes de faire avec distinctByKey, mais ça ne peut pas fonctionner, puisque le traitement est censé tenir compte de la date et de la distance, qui n'apparaissent nulle part dans cette fonction.

    On pourrait écrire un Collector qui fait le job, mais... pour faire ce que tu veux, il suffit de faire une réduction puisqu'on cherche les "plus ancien", et parmi les doublons de ceux-ci, les plus courts. Et cette réduction s'applique à un groupement sur l'identifiant, puisqu'on cherche les plus courts des plus anciens pour chaque identifiant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    public class Demo {
     
    	public static void main(String[] args) {
     
    		List<VoyageBean> list = Arrays.asList(
    				new VoyageBean("FAT_1", LocalDate.of(2016, 1, 1), 1000),
    				new VoyageBean("FAT_1", LocalDate.of(2016, 2, 2), 1500),
    				new VoyageBean("FAT_1", LocalDate.of(2016, 3, 3), 2000),
    				new VoyageBean("FAT_2", LocalDate.of(2016, 1, 1), 1000),
    				new VoyageBean("FAT_2", LocalDate.of(2016, 1, 1), 1010),
    				new VoyageBean("FAT_2", LocalDate.of(2016, 3, 3), 2000),
    				new VoyageBean("FAT_3", LocalDate.of(2016, 1, 1), 1000),
    				new VoyageBean("FAT_3", LocalDate.of(2016, 1, 1), 1000),
    				new VoyageBean("FAT_3", LocalDate.of(2016, 3, 3), 2000)
    		);
     
    		List<VoyageBean> result = list.stream()
    		    .collect(
    		    		Collectors.groupingBy(VoyageBean::getFat, // groupement sur l'identifiant
    		    		Collectors.reducing(
    		    				BinaryOperator.minBy( 
    		    						Comparator.comparing(VoyageBean::getDate) // réduction sur la date la plus ancienne
    		    						.thenComparing(VoyageBean::getDistance)) // réduction de la distance la plus courte
    		    				)
    		    		))
    		    .values() // on veut une liste, et la réduction donne des Optional<VoyageBean>, on remap donc sur des VoyageBean
    		    .stream()
    		    .map(v-> v.orElse(null)) // on remap sur des VoyageBean
    		    .sorted(Comparator.comparing(VoyageBean::getFat))
    		    .collect(Collectors.toList());
     
    		System.out.println(result);
     
    	}
     
     
    	public static class VoyageBean {
    		private String fat;
    		private LocalDate date;
    		private long distance; 
    		public VoyageBean(String fat, LocalDate date, long distance) {
    			this.fat=fat;
    			this.date=date;
    			this.distance=distance;
    		}
     
    		public String getFat() {
    			return fat;
    		}
     
    		public LocalDate getDate() {
    			return date;
    		}
     
    		public long getDistance() {
    			return distance;
    		}
     
    		@Override
    		public String toString() {
    			return fat+" "+date.format(DateTimeFormatter.ofPattern("dd/MM/yyyy"))+" "+distance+"km";
    		}
     
    	}
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 12
    Par défaut Supprimer les doublons en prenant l'objet le plus ancien dans une liste Java
    Merci Joel pour cet exercice de programmation fonctionnelle, ta solution marche

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. supprimer les doublons dans une table
    Par mavean dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 26/06/2019, 13h26
  2. Comment supprimer les doublons
    Par djelloulc dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 17/09/2013, 14h30
  3. Comment supprimer les doublons?
    Par Dnx dans le forum Langage SQL
    Réponses: 3
    Dernier message: 24/11/2005, 16h35
  4. [vbexcel]Comment supprimer les doublons dans une combobox?
    Par Mugette dans le forum Macros et VBA Excel
    Réponses: 20
    Dernier message: 24/11/2005, 11h12
  5. [ListView]Supprimer les doublons
    Par mohamed dans le forum Composants VCL
    Réponses: 1
    Dernier message: 27/10/2005, 12h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo