Meilleure façon de détecter si une chaîne contient plusieurs mots
Bonjour camarades! Je suis en train de créer un programme qui détecte si plusieurs mots sont dans une chaîne aussi vite que possible, et si oui, exécute un comportement. De préférence, je voudrais qu'il détecte l'ordre de ces mots aussi, mais seulement si cela peut être fait rapidement. Jusqu'à présent, c'est ce que j'ai fait:
if (input.contains("adsf") && input.contains("qwer")) {
execute();
}
Comme vous pouvez le voir, de le faire pour de multiples mots de devenir ennuyeux. Est-ce la seule façon ou est-il un meilleur moyen de détection de plusieurs sous-chaînes? Et est-il un moyen de détection de l'ordre?
source d'informationauteur Silver
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser un tableau:
C'est efficace que celui affiché par vous, mais plus facile à gérer. La recherche d'une solution plus efficace sonne comme un micro d'optimisation qui doit être ignoré jusqu'à preuve du pour être, effectivement, un goulot d'étranglement de votre code, en tout cas avec un énorme jeu de cordes, la solution pourrait être un trie.
Je voudrais créer une expression régulière par les mots:
Pour plus de détails, voir cette réponse: https://stackoverflow.com/a/470602/660143
Si vous avez beaucoup de sous-chaînes à regarder vers le haut, puis une expression régulière n'est probablement pas beaucoup d'aide, de sorte que vous feriez mieux de mettre les sous-chaînes dans une liste, puis en itérant sur eux et en appelant
input.indexOf(substring)
sur chacun d'eux. Il renvoie unint
indice de l'endroit où la chaîne a été trouvée. Si vous jetez chaque résultat (à l'exception de -1, ce qui signifie que la sous-chaîne n'est pas trouvée) dans unTreeMap
(oùindex
est la clé et les sous-chaîne est la valeur), alors vous pouvez les récupérer dans l'ordre en appelantkeys()
sur la carte.Utiliser une structure d'arbre pour tenir les sous-chaînes par codepoint. Ceci élimine le besoin pour
Noter que ce n'est efficace que si l'ensemble aiguille est presque constante. Il n'est pas inefficace s'il y a des ajouts ou des suppressions de sous-chaînes, mais une initialisation différents à chaque fois pour organiser un lot de chaînes de caractères dans une structure en arbre serait certainement plus lent.
StringSearcher
:NeedleTree.java
:Dans Java 8, vous pourriez faire,