Précédent   Forum du club des développeurs et IT Pro > Dotnet > Général Dotnet > Framework .NET
Framework .NET Vos questions relatives à l'utilisation des différents Framework .NET
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 08/12/2012, 05h02   #1
Norris
Invité régulier
 
Inscription : juin 2009
Messages : 52
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : juin 2009
Messages : 52
Points : 6
Points : 6
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.
Norris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2012, 09h35   #2
ElTotor
Membre confirmé
 
Homme François DORIN
Chef de Projet
Inscription : décembre 2012
Messages : 103
Détails du profil
Informations personnelles :
Nom : Homme François DORIN
Localisation : France, Vienne (Poitou Charente)

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

Informations forums :
Inscription : décembre 2012
Messages : 103
Points : 219
Points : 219
Bonjour,

Citation:
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 :
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
ElTotor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2012, 12h39   #3
youtpout978
Membre Expert
 
Homme John Doe
Développeur .NET
Inscription : novembre 2010
Messages : 902
Détails du profil
Informations personnelles :
Nom : Homme John Doe
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur .NET

Informations forums :
Inscription : novembre 2010
Messages : 902
Points : 1 439
Points : 1 439
Pourquoi tu n'utilises pas plutôt un dictionnaire avec comme clé tes indices et comme valeur tes vertex, si tes indices sont unique.
youtpout978 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/12/2012, 01h46   #4
Graffito
Expert Confirmé Sénior
 
Avatar de Graffito
 
Inscription : janvier 2006
Messages : 5 389
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 5 389
Points : 6 033
Points : 6 033
Est-ce une simple question sur la technique de programmation ou un problème de performance ?
__________________
" Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson
Graffito est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/12/2012, 02h34   #5
Norris
Invité régulier
 
Inscription : juin 2009
Messages : 52
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : juin 2009
Messages : 52
Points : 6
Points : 6
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
Norris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2012, 12h16   #6
Norris
Invité régulier
 
Inscription : juin 2009
Messages : 52
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : juin 2009
Messages : 52
Points : 6
Points : 6
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.
Norris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2012, 13h35   #7
youtpout978
Membre Expert
 
Homme John Doe
Développeur .NET
Inscription : novembre 2010
Messages : 902
Détails du profil
Informations personnelles :
Nom : Homme John Doe
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur .NET

Informations forums :
Inscription : novembre 2010
Messages : 902
Points : 1 439
Points : 1 439
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:

youtpout978 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2012, 18h58   #8
ElTotor
Membre confirmé
 
Homme François DORIN
Chef de Projet
Inscription : décembre 2012
Messages : 103
Détails du profil
Informations personnelles :
Nom : Homme François DORIN
Localisation : France, Vienne (Poitou Charente)

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

Informations forums :
Inscription : décembre 2012
Messages : 103
Points : 219
Points : 219
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
ElTotor est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 12h05.


 
 
 
 
Partenaires

Hébergement Web