Sans itérer sur l'ensemble du tableau, comment puis-je vérifier si x
dans le tableau à l'aide de Go? La langue a-t-elle une construction?
Comme Python: if "x" in array: ...
Sans itérer sur l'ensemble du tableau, comment puis-je vérifier si x
dans le tableau à l'aide de Go? La langue a-t-elle une construction?
Comme Python: if "x" in array: ...
strings.Index
) aide à rendre plus évident ce que fait le code. J'ai l'impression que peut-être vous pensez que Pythonin array:
fait quelque chose de rapide / magique. AFAIK ce n'est pas. Rendre la boucle explicite permet de sensibiliser le rédacteur (et tous les lecteurs) et d'envisager d'autres implémentations (par exemple une carte).Réponses:
Il n'y a pas d'opérateur intégré pour le faire dans Go. Vous devez parcourir le tableau. Vous pouvez écrire votre propre fonction pour le faire, comme ceci:
Si vous voulez pouvoir vérifier l'appartenance sans itérer sur toute la liste, vous devez utiliser une carte au lieu d'un tableau ou d'une tranche, comme ceci:
la source
Une autre solution si la liste contient des valeurs statiques.
ex: vérification d'une valeur valide à partir d'une liste de valeurs valides:
la source
Ceci est une citation tirée du livre "Programming in Go: création d'applications pour le 21e siècle":
https://play.golang.org/p/UIndYQ8FeW
la source
n*log(n) + log(n)
, car ce sont deux opérations indépendantes conséquentesL'exemple ci-dessus utilisant sort est proche, mais dans le cas de chaînes, utilisez simplement SearchString:
https://golang.org/pkg/sort/#SearchStrings
la source
sort.SearchStrings
.Juste eu une question similaire et a décidé d'essayer certaines des suggestions de ce fil.
J'ai comparé les meilleurs et les pires scénarios de 3 types de recherche:
voici le code de fonction:
les meilleurs scénarios choisissent le premier élément dans les listes, les pires cas utilisent une valeur inexistante.
Voici les résultats:
BenchmarkBelongsToMapWorstCase-4 2000000 787 ns/op BenchmarkBelongsToSwitchWorstCase-4 2000000000 0.35 ns/op BenchmarkBelongsToListWorstCase-4 100000000 14.7 ns/op BenchmarkBelongsToMapBestCase-4 2000000 683 ns/op BenchmarkBelongsToSwitchBestCase-4 100000000 10.6 ns/op BenchmarkBelongsToListBestCase-4 100000000 10.4 ns/op
Switch gagne tout le chemin, le pire des cas est incroyablement plus rapide que le meilleur des cas. Les cartes sont les pires et la liste est plus proche de changer.
Donc, la morale est la suivante: si vous avez une liste statique et raisonnablement petite, la déclaration switch est la voie à suivre.
la source
:
au lieu de,
dans l'instruction switch? Cela accélère-t-il?case
déclarations au lieu d'un seul cas. Les résultats sont sensiblement les mêmes avec les deux fonctions.Une autre option consiste à utiliser une carte comme un ensemble. Vous utilisez uniquement les clés et la valeur doit être quelque chose comme un booléen qui est toujours vrai. Ensuite, vous pouvez facilement vérifier si la carte contient la clé ou non. Ceci est utile si vous avez besoin du comportement d'un ensemble, où si vous ajoutez une valeur plusieurs fois, elle n'est présente qu'une seule fois dans l'ensemble.
Voici un exemple simple où j'ajoute des nombres aléatoires comme clés d'une carte. Si le même nombre est généré plus d'une fois, cela n'a pas d'importance, il n'apparaîtra qu'une seule fois dans la carte finale. Ensuite, j'utilise une simple vérification si pour voir si une clé est dans la carte ou non.
Ici, c'est sur le terrain de jeu
la source
C'est aussi proche que possible de la sensation naturelle de l'opérateur "in" de Python. Vous devez définir votre propre type. Ensuite, vous pouvez étendre les fonctionnalités de ce type en ajoutant une méthode comme "has" qui se comporte comme vous l'espérez.
J'ai une bibliothèque d'utilitaires où je définis quelques éléments communs comme celui-ci pour plusieurs types de tranches, comme celles contenant des entiers ou mes propres autres structures.
Oui, cela fonctionne en temps linéaire, mais ce n'est pas le but. Le but est de demander et d'apprendre quelles constructions de langage communes Go a et n'a pas. C'est un bon exercice. Que cette réponse soit stupide ou utile dépend du lecteur.
la source