trublue
Messages postés37Date d'inscriptionvendredi 24 juillet 2009StatutMembreDernière intervention25 mai 2010
-
17 avril 2010 à 12:50
trublue
Messages postés37Date d'inscriptionvendredi 24 juillet 2009StatutMembreDernière intervention25 mai 2010
-
18 avril 2010 à 15:47
salut à tous,
je veux faire une fonction de recherche qui fonctionne comme suite:
j'ai une zone de texte à chaque fois que l'utilisateur tape un caractère une liste triée de noms s'affiche
ces noms sont contenus dans un fichier.
trublue
Messages postés37Date d'inscriptionvendredi 24 juillet 2009StatutMembreDernière intervention25 mai 2010 17 avril 2010 à 23:45
salut,
Oui il y a beaucoup de noms même des milliers et je dois utiliser un fichier pour les stocker.
J'espère que tu as bien compris ce que je veux faire comme dans google par exemple an tapant un caractère une liste de noms s'affiche et elle se met à jour à chaque fois qu'on tape un autre caractère.
Merci de m'aider si vous pouvez
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 18 avril 2010 à 07:40
Salut,
Ok, ton problème principal va être la performance : il faut que tu puisse trouver en un temps records les termes qui correspondent le mieux aux caractères tapés par l'utilisateur (si l'utilisateur tape vite, il faut vite chercher...).
Ce que je te conseille de faire (des astuces pour y gagner beaucoup en performance) :
Tu charges tout tes mots en mémoire (dans un ArrayList par exemple), que tu tries (méthode sort de la classe Collections).
Lorsqu'un utilisateur tape un caractère, tu te construis une liste des mots correspondant.
Sachant que ta liste est triée, tu peux gagner énormément de temps en la parcourant par moitié : tu commence par le milieu de ta liste, si le mot trouvé est supérieur aux quelques caractères saisis, alors tu teste le mot au quart de ta liste, sinon, tu teste le mot au 3/4 de ta liste, etc. (c'est le principe du tri rapide, tu y gagnera énormément en temps de traîtement).
Tu n'es pas obligé de faire la recherche à chaque caractères tapé : tu mets un timer dès qu'un nouveau caractère et tapé (de 250 ms par exemple), et tu ne déclenche la recherche qu'au bout de ces 250 ms. Ainsi si l'utilisateur tape 3 caractère en 250 ms, tu ne feras pas 3 recherches, mais une seule avec les 3 caractères, ca donnera le même résultat pour l'utilisateur, mais ca t'économisera pas mal de ressources).
Tu stocke 3 listes, une contenant tout les mots, une correspondant à la recherche précédente, et une correspondant à la recherche courante.
Un exemple : l'utilisateur tape "t", alors tu as :
* ListeComplète (contient tout les mots : 10000 mots)
* ListePrécédente = ListeComplète (contient tout les mots : 10000 mots)
* ListeCourante = Liste des mots commencant par "t" : 200 mots
L'utilisateur tape ensuite "e", alors tu as :
* ListeComplète (contient tout les mots : 10000 mots)
* ListePrécédente = Liste des mots commencant par "t" : 200 mots
* ListeCourante = Liste des mots commencant par "te" : 15 mots, récupérée à partir de la ListePrécédente (donc tu ne parcourts plus que 200 mots au lieu des 10000 !)
L'utilisateur tape ensuite "n", alors tu as :
* ListeComplète (contient tout les mots : 10000 mots)
* ListePrécédente = Liste des mots commencant par "te" : 15 mots
* ListeCourante = Liste des mots commencant par "ten" : 5 mots, récupérée à partir de la ListePrécédente (donc tu ne parcourts plus que 15 mots au lieu des 10000 !)
Ensuite, lorsque l'utilisateur efface une lettre, tu remonte dans ton historique :
L'utilisateur efface la lettre "n", alors tu as :
* ListeComplète (contient tout les mots : 10000 mots)
* ListePrécédente = Liste des mots commencant par "te" : 15 mots
* ListeCourante = ListePrécédente (pas besoin de relancer la recherche).
______________________________________
AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement