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

Collection et Stream Java Discussion :

Algo qui supprime les doublons d'une collection


Sujet :

Collection et Stream Java

  1. #1
    Membre éprouvé Avatar de jmnicolas
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2007
    Messages : 427
    Points : 976
    Points
    976
    Par défaut Algo qui supprime les doublons d'une collection
    Bonjour,

    je souhaite supprimer les doublons d'une collection, toutefois mon algo ne fonctionne pas bien, et je sèche un peu là :

    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
    public static void main (String [] args)
    	{
    		Vector <Integer> victor = new Vector <Integer> () ;
    		victor.add (100) ;
    		victor.add (200) ;
    		victor.add (300) ;
    		victor.add (400) ;
    		victor.add (100) ;
    		victor.add (500) ;
    		victor.add (600) ;
    		victor.add (600) ;
    		victor.add (600) ;
    		victor.add (100) ;
     
    		for (Integer ig : victor)
    		{
    			System.out.print (ig + " ") ;
    		}
    		System.out.println () ;
     
     
    		int taille = victor.size () ;
     
    		for (int i = 0; i < taille; i ++ )
    		{
    			for (int n = 0; n < taille; n ++ )
    			{
    				if (n == i)
    				{
    					continue ;
    				}
     
    				if (victor.elementAt (i) == victor.elementAt (n))
    				{
    					victor.remove (n) ;
    					taille -- ;
    				}
    			}
    		}
     
    		for (Integer ig : victor)
    		{
    			System.out.print (ig + " ") ;
    		}
     
    	}
    C'est directement testable dans votre IDE favori
    Comme on supprime des éléments du vector sa taille change.
    J'aimerais éviter de devoir passer par un 2e vector, car là ce n'est qu'un exemple, mais le vectro sur lequel je travaille est assez grand.

    A vot' bon coeur m'sieurs dames
    The greatest shortcoming of the human race is our inability to understand the exponential function. Albert A. Bartlett

    La plus grande lacune de la race humaine c'est notre incapacité à comprendre la fonction exponentielle.

  2. #2
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 534
    Points : 562
    Points
    562
    Par défaut
    Question:
    Si tu supprimes les doubles --> l'ordre des elements n'est pas important pour toi?

    Si oui alors, tu crees un map et mets ton vecteur dans ce map et remets ce map dans ton vecteur result. (la complexite est de l'order de n)

  3. #3
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 563
    Points : 15 505
    Points
    15 505
    Par défaut
    Et même si l'ordre est Important alors un LinkedHashSet fera l'affaire.

    Il pourrait même abandonner complètement le Vector(qui n'est plus conseillé depuis java 1.2) pour un Set (ou une List s'il a besoin d'un accès aléatoire).

  4. #4
    Membre éprouvé Avatar de jmnicolas
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2007
    Messages : 427
    Points : 976
    Points
    976
    Par défaut
    Salut,

    l'ordre n'est pas vraiment important, mais j'aimerais faire ça intelligemment plutôt que facilement.

    D'une part pour apprendre, d'autre part pour économiser des ressources (le programme mouline déjà 6 minutes sur un Core 2 Duo pour me générer un résultat alors bon ).

    J'ai déjà une solution qui fonctionne (transférer dans un 2e vecteur), j'aimerais juste trouver la façon de le faire autrement.
    The greatest shortcoming of the human race is our inability to understand the exponential function. Albert A. Bartlett

    La plus grande lacune de la race humaine c'est notre incapacité à comprendre la fonction exponentielle.

  5. #5
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Lorsque tu supprimes un élément de ton vecteur, tu décales automatiquement les éléments suivants, ce qui fait que tu "sautes" un élément.

    Par exemple prenons les valeurs suivantes : A B C D E.

    Lorsque tu est à l'index 2 tu es sur la valeur "C".
    Si tu le supprimes et que tu incrémentes l'index, tu passe logiquement à l'index 3, mais le "D" lui est passé à l'index 2 puisque ton vecteur contient désormais ceci : A B D E.


    Ce problème survient du parcourt par index. Tu peux éviter cela en parcourant ton tableau à l'envers (les éléments décalés auront déjà été traité, ce qui permet de les ignorer).

    Au passage tu peux utiliser indexOf() pour éviter la seconde boucle. Cela donnerait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	for (int i = victor.size()-1; i>=0; i--) {
    		Integer value = victor.get(i);
    		if (victor.indexOf(value) != i) {
    			victor.remove(i);
    		}
    	}
    Maintenant, je serais tenter de dire qu'il faut éviter les parcours par index, car il peuvent se révéler casse-gueule, et privilégier les accès via Iterator bien plus sécurisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	ListIterator<Integer> iterator = victor.listIterator(victor.size());
    	while (iterator.hasPrevious()) {
    		int index = iterator.previousIndex();
    		Integer value = iterator.previous();
     
    		if (victor.indexOf(value) != index) {
    			iterator.remove();
    		}
    	}

    a++

    PS : Et au passage Vector est à déconseillé.
    De même si tu manipules des types primitifs il serait préférable de passer par un tableau de type primitif ou par un collection typé primitif.

  6. #6
    Membre éprouvé Avatar de jmnicolas
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2007
    Messages : 427
    Points : 976
    Points
    976
    Par défaut
    Ah oui c'est plus malin avec un indexOf() ça évite une 2ème boucle

    Sinon pour les vectors je suis au courant, mais l'appli en contient encore quelques uns, je les remplace par des arraylist quand je suis motivé.

    Le code que j'ai mis au début n'était qu'un exemplaire de test, dans mon appli ce sont des objets que j'ai créé moi qui sont manipulés et pas des entiers.

    Merci.
    The greatest shortcoming of the human race is our inability to understand the exponential function. Albert A. Bartlett

    La plus grande lacune de la race humaine c'est notre incapacité à comprendre la fonction exponentielle.

  7. #7
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jmnicolas Voir le message
    Ah oui c'est plus malin avec un indexOf() ça évite une 2ème boucle
    La seconde boucle existe toujours, mais dans le indexOf()

    Citation Envoyé par jmnicolas Voir le message
    Sinon pour les vectors je suis au courant, mais l'appli en contient encore quelques uns, je les remplace par des arraylist quand je suis motivé.
    Ce que tu peux déjà faire, c'est les déclaré en tant que List et non pas en tant que Vector. Cela te permettra d'éviter d'utiliser les vieilles méthodes (comme elementAt()) au profit des nouvelles versions (comme get()). Cela simplifie grandement la migration par la suite


    Citation Envoyé par jmnicolas Voir le message
    Le code que j'ai mis au début n'était qu'un exemplaire de test, dans mon appli ce sont des objets que j'ai créé moi qui sont manipulés et pas des entiers.
    C'était juste au cas où


    a++

+ 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. Réponses: 16
    Dernier message: 03/06/2014, 07h39
  3. pour supprimer les doublons d'une table qcq
    Par lamjed dans le forum Oracle
    Réponses: 7
    Dernier message: 19/12/2008, 16h42
  4. Comment supprimer les doublons d'une table?!
    Par JauB dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 27/01/2006, 08h48
  5. [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

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