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

VB.NET Discussion :

Chercher dans un array avec uniquement le début du nom [VB]


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 158
    Par défaut Chercher dans un array avec uniquement le début du nom [VB]
    Bonjour,

    J'ai une liste d'objet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public romIndex As New List(Of Games)
    Voici classe objet 'game' dans laquelle j'ai intégré une fonction de comparaison basée sur 'descript'.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Public Class Games
        Public Shared ReadOnly DescriptComparer As New DescriptComparerClass
        Public rom As String
        Public descript As String
        Public genre As String
        Sub New()
        End Sub
        Public Class DescriptComparerClass
            Implements IComparer(Of Games)
            Public Function Compare(ByVal x As Games, ByVal y As Games) As Integer Implements System.Collections.Generic.IComparer(Of Games).Compare
                Return String.Compare(x.descript, y.descript, True)
            End Function
        End Class
    End Class
    Ce qui me permet de faire du tri et BinarySearch basé sur 'descript' dans la liste

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    romIndex.Sort
    Dim ng As New Games
    ng.descript = "test"
    Dim ndx As Int32 = romIndex.BinarySearch(0, romIndex.Count, ng, Games.DescriptComparer)
    If ndx >= 0 Then
       Debug.Print ("Trouvé")
    End If


    Alors, voila ma question:
    =================

    Comment pourrais-je faire une recherche dans la liste en partant uniquement des lettres du début du string. Donc pour reprendre l'exemple, trouver dans la liste le premier élément qui commencerait par "Te" (et qu'il me trouve "Test").

    Pour l'instant j'ai simplement une boucle, mais je voudrais quelque chose de plus abouti car cela concerne des dizaines de milliers d'éléments et je sais qu'il doit y avoir plus performant que ma boucle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    For Each ri As Games In romIndex
     If ri.descript.ToUpper.StartsWith(texteàtrouver) Then
      ...
      ...
      Exit For
     End If
    Next
    Que puis je utiliser (et comment) qui ait la même "rapidité" qu'un BinarySearch (sur le string complet) avec uniquement le début d'un string?



    J'espère que j'ai pu me faire comprendre ;-) et je vous remercie d'avance de l'aide que vous voudrez bien m'apporter

  2. #2
    Membre Expert Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Par défaut
    Bonjour,

    D'abord, la liste de tes jeux... tu la charge depuis une base de données ? Auquel cas une requête sera beaucoup plus rapide.

    si pas de base de données, alors j'imagine que tu vas stockés tes informations dans un ou plusieurs fichier que tu vas chargé dans le programme.

    Dans ce cas là, oui il y a plus rapide qu'une boucle: Trié tes jeux par ordre alphabétique sur la description, et faire une recherche dichotomique.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 158
    Par défaut
    mactwist69,
    Merci pour ta réponse!
    Non, la liste des éléments à afficher est en mémoire.
    Et oui, les éléments sont déjà trié ('romIndex.Sort' dans le code posté) et trié sur '.descript' de la classe 'Games'..
    Ce que je voudrais maintenant c'est faire une recherche sur le premier éléments qui commence par les quelques lettres du début.
    En clair, si dans ma 'list(of Games)' j'ai des élément dont la propriété '.descript' = "TestA", "TestB", TostA", TostB",
    je veux pouvoir, si j'entre "Te", trouver le premier, à savoir "TestA" et avoir son index en retour.

    J’espère que je suis clair ;-) Merci pour ton aide

  4. #4
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Tu veux "le premier" (TestA) ou "n'importe lequel" (TestA, TestB ou TestC) des jeux qui commencent par "Te" ?

    Si c'est "le premier", alors la dichotomie ne marchera pas.
    Tu pourras éventuellement représenter ta liste sous forme d'un arbre, utilisant les lettres comme noeuds.

    Si c'est "n'importe lequel", alors la dichotomie sera la plus rapide en effet.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 158
    Par défaut
    Non, c'est bien le premier que je veux trouver
    Comment est ce que cela se traduirait en code, stp? Car "représenter ta liste sous forme d'un arbre" ne me parle pas ;-)

  6. #6
    Membre Expert Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Par défaut
    Un exemple serait que tu fasses une liste par lettre de l'alphabet, ainsi avec un select case, tu "jump" direct sur la bonne première lettre.

    Ça peut être une forme de division dans la recherche.

  7. #7
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Citation Envoyé par Jayme65 Voir le message
    Non, c'est bien le premier que je veux trouver
    Comment est ce que cela se traduirait en code, stp? Car "représenter ta liste sous forme d'un arbre" ne me parle pas ;-)
    Bonjour.

    Voici un exemple naïf (simple) pour une structure de données contenant les mots "bol", "bou" et "boule". On utilise en général '\0' comme marqueur de fin de chaîne mais je l'ai remplacé par '@' par souci de clarté.
                  @
                 / 
               E
              /
             L
            /  
          U  
         /  \ 
    B - O    @
         \
          L
           \ 
            @
    Personnellement, pour quelques dizaines de milliers d'éléments, je resterais tout de même sur une approche dichotomique pour trouver n'importe quel élément commençant pas "bo" puis je reviendrais en arrière avc un scan linéaire pour trouver le premier. Plus simple à écrire, moins gourmand en mémoire. Et sans doute plus rapide aussi, question de localité des références.

    Cela dit, n'est-ce pas de l'optimisation prématurée ? Un traitement de 50ms est instantané aux yeux de l'utilisateur. Pour 50k éléments cela laisse 1000 ns par élément ! A raison de 1ns par opération basique, 5ns par appel de fonction virtuelle et 10ns par défaut de cache L1, on a de la marge ! Un bête scan linéaire pourrait donc suffire.

    PS : Aujourd'hui, avec cet autre post, c'est officiellement ma journée dessin. Très récréatif ce vendredi.

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/07/2010, 10h25
  2. Réponses: 6
    Dernier message: 19/02/2010, 13h17
  3. [PHP 5.2] Jolie NOTICE avec un string dans l'array
    Par Jonahboss dans le forum Langage
    Réponses: 4
    Dernier message: 29/07/2009, 11h38
  4. Réponses: 2
    Dernier message: 30/03/2009, 10h59
  5. [Tableaux] Chercher une chaîne de caractères dans un array()
    Par Julien Rozier dans le forum Langage
    Réponses: 2
    Dernier message: 03/05/2008, 12h55

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