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

Framework .NET Discussion :

Enlever doublons d'une liste un peu spéciale


Sujet :

Framework .NET

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 53
    Points : 36
    Points
    36
    Par défaut Enlever doublons d'une liste un peu spéciale
    Bonjour !
    Je me trouve face à un problème que je n'ai pas encore rencontré. Je travaille sur la 3D OpenGL avec une liste de vertex et d'indices afin de construire des polygones.
    J'ai une liste générique (List(Of)) contenant des instances d'une structure perso (Vertex3D). Cette liste peut-être en désordre.
    En parallèle, j'ai une autre liste contenant des indices (Integer).
    Pour construire des polygones, j'utilise ma liste d'indices que j'ai fais exprès de remplir dans l'ordre. J'entends par là que les 3 premiers indices me servent à récupérer 3 vertex dans ma première liste, les 3 prochains indices pour un deuxième polygone ...etc...

    Mon principal problème est d'enlever les doublons de la première liste tout en modifiant l'indice correspondant dans ma& liste d'indices.

    J'ai trouvé une multitude de faons d'enlever les doublons d'une liste sur le net, mais aucune n'est entièrement écrite à la main, et donc je ne peut pas modifier mes indices en même temps.

    De plus, j'ai souvent lu que a foutait le bazar dans une méthode quand on a besoin d'enlever des éléments tout en ayant accès à ses éléments.

    Existerait-il quelque part un exemple de suppression de doublons d'une liste générique entièrement écrite à la main ?
    Pour ce qui est de modifier les indices de ma deuxième liste en conséquence, je pense m'en sortir, mais je n'arrive à rien avec le problème de base.

    Merci d'avance pour votre aide.

  2. #2
    Membre actif
    Homme Profil pro
    Chef de Projet
    Inscrit en
    Décembre 2012
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Chef de Projet
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Décembre 2012
    Messages : 113
    Points : 260
    Points
    260
    Par défaut
    Bonjour,

    De plus, j'ai souvent lu que a foutait le bazar dans une méthode quand on a besoin d'enlever des éléments tout en ayant accès à ses éléments.
    C'est vrai. Par exemple, en C# (mais je suppose que c'est la même chose en VB), lorsqu'on parcours une collection via une boucle foreach, il n'est pas possible de modifier la collection sans lever une exception.

    Sinon, pour répondre à ta question, je pense qu'une manière simple de faire est de parcourir ta liste d'objet à l'aide des indices. Pour chaque objet, tu le recherches dans la liste et tu regardes l'indice de l'élément trouvé.

    S'il est égal à l'indice courant, alors c'est que c'est la première fois que l'objet est trouvé. Il n'y a rien à faire.

    S'il est inférieur, alors l'élément existe déjà. Tu peux donc le supprimer et mettre à jour ta liste d'indice.

    Voici un exemple de comment je ferais les choses :

    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
     
    int i = 0;
    while(i < vertexesList.Count)
    {
       int index = vertexesList.IndexOf(vertexesList[i]);
     
       if (index < i)
       {
          vertexesList.RemoveAt(i);
          for(int j = 0; j < indexList.Count; ++j)
          {
              if (indexList[j] == i)
              {
                 indexList[j] = index;
              }
              else
              {
                 if (indexList[j] > i)
                 {
                    // On a supprimé l'élément à l'index j de la liste.
                    // Tous les éléments après se retrouvent donc à 
                    // l'index précédent. Il faut donc mettre à jour
                    // la liste des index.
                    indexList[j]--;
                 }
              }
          }
          // on incrémente pas i, pour la simple et bonne raison qu'on vient
          // de supprimer l'élément qui était à cet index. L'élément i+1 se retrouve
          // donc à l'index i
       } 
       else
       {
          // Rien à faire. On passe à l'index suivant
          ++i;
       }
    }
    Attention, je n'ai pas testé le code

  3. #3
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    Pourquoi tu n'utilises pas plutôt un dictionnaire avec comme clé tes indices et comme valeur tes vertex, si tes indices sont unique.

  4. #4
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Est-ce une simple question sur la technique de programmation ou un problème de performance ?
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 53
    Points : 36
    Points
    36
    Par défaut
    Bonsoir, et merci pour vos réponses.

    ElTotor: J'avoue ne pas avoir trop compris le principe...juste les grandes lignes. Mais ça m'ouvre d'autres perspectives. Il faut que je teste ça pour réellement comprendre le truc. Et merci pour l'info sur l'exception levée

    youtpout978: Oui, c'est avec un Dictionary que je pensais procéder, mais sans avoir fait de tests, cette méthode reste aussi un peu floue pour moi.
    Et non, ma liste d'indices ne contient pas forcément que des indices uniques.
    Du coup, je ne sais trop quoi utiliser comme clé.

    Graffito: C'est plus un problème technique qu'une histoire de performances, mais je sais que si je m'y prends mal je risque de mettre 10 secondes pour effectuer un truc qui n'est censé prendre qu'un temps infime.
    J'ai déjà du écrire un truc dans le genre, et c'était horriblement long alors qu'après correction ça se comptait en millisecondes.

    Merci beaucoup pour vos conseils. Je vais tenter le coup avec un Dictionary, et ElTotor, je garde ton principe sous le coude, car même si je ne comprends pas tout, je sens que a peu m'aider.

    Je repasse dans le coin si je n'arrive pas à me dépatouiller de ça

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 53
    Points : 36
    Points
    36
    Par défaut
    Bonjour, je repasse dans le coin juste pour dire que je m'en suis sorti avec un dictionnaire .
    J'ai utilisé un "OrderedDictionary" au lieu d'un dictionnaire générique car j'ai obligation de garder mes entrées dans leur ordre d'insertion. Je viens tout juste de découvrir qu'un simple dico générique ne garantit pas nécessairement que l'ordre sera le même
    Du coup, je me demande; qu'est-ce qui peut faire que l'ordre des éléments d'un dico générique (Dictionary(Of Tkey, Tvalue)) peut changer ?

    Je n'ai pas trouvé de réponses chez Microsoft. De plus je n'ai jamais remarqué de changement d'ordre avec un dico lors d'énumérations.

  7. #7
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    Si tu supprimes une donnée dans un dictionnaire et qu'ensuite tu insert une donnée, la nouvelle donnée se trouvera là ou l'ancienne donnée était.
    Alors que l'ordereddictionnary semble mettre les nouvelles données après la dernière donnée qu'il contient.
    Comme on le voit sur cet exemple:


  8. #8
    Membre actif
    Homme Profil pro
    Chef de Projet
    Inscrit en
    Décembre 2012
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Chef de Projet
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Décembre 2012
    Messages : 113
    Points : 260
    Points
    260
    Par défaut
    Citation Envoyé par Norris Voir le message
    Bonjour, je repasse dans le coin juste pour dire que je m'en suis sorti avec un dictionnaire .
    J'ai utilisé un "OrderedDictionary" au lieu d'un dictionnaire générique car j'ai obligation de garder mes entrées dans leur ordre d'insertion. Je viens tout juste de découvrir qu'un simple dico générique ne garantit pas nécessairement que l'ordre sera le même
    Du coup, je me demande; qu'est-ce qui peut faire que l'ordre des éléments d'un dico générique (Dictionary(Of Tkey, Tvalue)) peut changer ?

    Je n'ai pas trouvé de réponses chez Microsoft. De plus je n'ai jamais remarqué de changement d'ordre avec un dico lors d'énumérations.
    Bonsoir,

    Peux-tu poster ton code ? Car j'avoue que j'ai du mal à imaginer une solution à base de dictionnaire (ou alors j'ai compris le problème de travers ).

    Merci d'avance

Discussions similaires

  1. [C# 2.0] Détecter les doublons dans une List<string>
    Par Rodie dans le forum Windows Forms
    Réponses: 36
    Dernier message: 30/03/2013, 15h21
  2. Enlever des doublons dans une liste
    Par frites.saucisse dans le forum Général Python
    Réponses: 8
    Dernier message: 23/06/2010, 21h03
  3. Enlever les doublons dans une liste
    Par gefrey54 dans le forum Powerbuilder
    Réponses: 2
    Dernier message: 14/09/2007, 17h46
  4. Réponses: 13
    Dernier message: 01/08/2006, 16h59
  5. [Oracle] Doublon dans une liste
    Par shaun_the_sheep dans le forum Oracle
    Réponses: 9
    Dernier message: 09/06/2006, 16h09

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