Disons que j'ai une Java ArrayList, qui est triée. Maintenant, je voudrais trouver l'indice de la valeur x. Quel serait le moyen le plus rapide (sans plus de 30 lignes de code) de le faire? Utilisation de la méthode IndexOf()? Itérer à travers toutes les valeurs dans une boucle simple? Utilisation d'un algorithme sympa? Nous parlons d'environ disons 50 clés entières.Meilleure façon de trouver une valeur dans List lorsque la liste est triée
Répondre
Binary search, mais comme il n'y a que 50 articles, on s'en soucie (sauf si vous devez le faire des millions de fois)? Une recherche linéaire simple est plus simple et la différence de performance pour 50 articles est négligeable.
Modifier: Vous pouvez également utiliser la méthode intégrée java.util.Collections binarySearch. Sachez qu'il retournera un point d'insertion même si l'élément n'est pas trouvé. Vous devrez peut-être faire un couple supplémentaire de vérifications pour vous assurer que l'article est vraiment celui que vous voulez. Merci à @Matthew pour le pointeur.
tvanfosson a raison, le temps pour l'un ou l'autre sera très faible, donc à moins que ce code ne fonctionne très fréquemment, cela ne fera pas beaucoup de différence.
Cependant, Java a une fonctionnalité intégrée pour les recherches binaires de listes (y compris ArrayLists), Collections.binarySearch.
Si les clés ont une distribution acceptable, Interpolation Search peut être très rapide si l'on considère le temps d'exécution. Considérer l'heure de codage IndexOf()
est le chemin à parcourir (ou une recherche binaire intégrée si disponible pour votre type de données (je viens de C# et je ne connais pas Java)).
import java.util.ArrayList;
import java.util.Collections;
ArrayList myList = new ArrayList();
// ...fill with values
Collections.sort(myList);
int index = Collections.binarySearch(myList, "searchVal");
Edit: code non testé
Merci pour le code :) – Baversjo
- 1. Meilleure façon de rechercher une valeur de saturation dans une liste triée
- 2. La meilleure façon de trouver si une chaîne est dans une liste (sans génériques)
- 3. Trouver la valeur la plus proche dans une liste ordererd
- 4. Quelle est la meilleure façon de trouver l'inverse de datetime.isocalendar()?
- 5. Quelle est la meilleure façon de rechercher une valeur de dictionnaire Python dans une liste de dictionnaires?
- 6. Quelle est la meilleure façon de stocker une liste de messages/arbre fileté dans SQL?
- 7. Meilleure façon de créer une liste dynamique (liste déroulante)?
- 8. La meilleure façon de concaténer la liste des objets String?
- 9. Quelle est la meilleure façon d'obtenir une valeur de retour d'un asyncExec dans Eclipse?
- 10. sélection de l'enregistrement suivant dans une liste triée par date
- 11. Quelle est la meilleure façon de réorganiser aléatoirement une liste d'éléments dans C#?
- 12. Comment vérifier si une valeur donnée est une liste générique?
- 13. Meilleure façon d'obtenir une valeur DateTime statique
- 14. Quelle est la meilleure façon de créer un objet Python lorsque l'implémentation de la classe est stockée dans une chaîne?
- 15. Meilleure façon d'utiliser une liste <T> dans une collection Key/Value?
- 16. printemps - la meilleure façon de traiter la liaison à une liste de haricots dans un SimpleFormController
- 17. La meilleure façon de mettre à jour dans un db une liste de mails
- 18. La façon la plus succincte de déterminer si une variable est égale à une valeur d'une «liste» de valeurs
- 19. Quelle est la meilleure façon de formater C# dans WordPress?
- 20. Quelle est la meilleure façon de trouver à quelle bibliothèque une fonction peut appartenir?
- 21. VB.NET: Quelle est la meilleure façon de récupérer une valeur d'un second formulaire?
- 22. Quelle est la meilleure façon de vérifier si l'option actuellement sélectionnée dans une liste déroulante est la dernière?
- 23. Meilleure façon de randomiser une liste de chaînes en Python
- 24. Est-il possible (ou ok) d'avoir une liste std :: list de std :: list?
- 25. Quelle est la meilleure façon de trier une liste partiellement ordonnée?
- 26. Meilleure façon de gérer une liste d'email. NET
- 27. C# Comment trier une liste triée par sa colonne de valeur
- 28. Quelle est la meilleure façon d'appliquer une ombre portée?
- 29. Quelle est la meilleure façon de manipuler et de stocker d'énormes listes ordonnées ou des hachages?
- 30. Quelle est la meilleure façon de supprimer les espaces après un certain caractère dans une chaîne?
Pour cinquante clés, je suis entièrement d'accord. Le temps de développement est plus important que le temps CPU ces jours-ci. Utilisez IndexOf() et soyez sur votre chemin. –
Sauf que Java/a/cette fonctionnalité. –
La recherche binaire est la voie à suivre. La liste peut actuellement avoir seulement 50 articles, mais qui sait ce que le code devra gérer dans un an ou deux .. –