Comment puis-je vérifier si une chaîne représente une chaîne longue, double ou juste une chaîne ordinaire? J'ai besoin de le faire car cette valeur doit être indexée dans une base de données en fonction de son type. Actuellement, je le fais en essayant d'analyser la chaîne et de rechercher des exceptions, mais que le code est appelé très fréquemment, je me demande s'il y a un moyen plus efficace de le faire. Mon code ressemble actuellement à ceci: Je viens de faire un exercice d'analyse comparative rapide selon la suggestion de @ user949300 pour utiliser les motifs de RegEx. et il a été légèrement meilleur que le code de manipulation des exceptions ci-dessus. Voici le code au cas où quelqu'un d'autre le trouve utile: P> --- Exception handling code ---
STRING - actual: 19861, found: 19861
DOUBLE - actual: 4942, found: 4942
LONG - actual: 25197, found: 25197
Time taken: 2561 ms
--- Regex pattern matching code ---
STRING - actual: 19861, found: 19861
DOUBLE - actual: 4942, found: 4942
LONG - actual: 25197, found: 25197
Time taken: 1565 ms
6 Réponses :
Autant que je sache, il n'y a pas de moyen élégant de faire cela autre que cela. Je vous recommanderais de les analyser de l'ordre de plus commun le moins commun afin de le rendre aussi rapide que possible. p>
Si vous avez plus de 3 types possibles, vous allez avoir un nid code> profonde et laids>, mais techniquement, il sera plus rapide que si vous avez rompu chaque test de paquet sa propre méthode; Le compromis ici est de savoir si vous souhaitez une clarté du code ou une exécution plus rapide - on dirait que vous voudrez peut-être que ce dernier. p>
Si je vous ai bien compris, alors l'analyse de l'ordre de fréquence de l'événement ne fonctionnera pas car String b> Les représentations seraient un superset strict de double b>, ce qui serait à son tour un superset strict de long b>. Si une valeur est censée être longue, elle analysera toujours avec succès comme double sans soulever une exception.
@Dawood: Tu as raison. Mon point est que la pensée devrait être donnée à l'ordre dans lequel vous analyse pour que vous puissiez (espérons-le) éviter de travailler.
Vous pourriez être en mesure d'obtenir une certaine amélioration (surtout si vous pouvez exclure la notation scientifique, _g. n'oubliez pas les signes moins, si ceux-ci sont possibles dans vos données ... p>
Doubles sont plus difficiles car 1e12 code>) en vérifiant simplement les non-chiffres pour détecter une longue. p>
long.parselong () code> délégués à une méthode générale qui fonctionne dans n'importe quel numéro de numéro de numéro, une méthode décimale que seule pourrait être un peu plus rapide. P>
654.1236871 code> est valide, mais
654.12.36.87 ... 1 code> n'est pas, bien qu'ils contiennent le même ensemble de caractères. Un analysement complet est probablement nécessaire. P>
Votre code a l'air bien. P>
Faites du profilage, et si vous êtes basé sur celui-ci, vous trouvez votre code trop lent, vous pouvez penser à des optimisations potentielles (comme une boucle simple pour voir si tous les caractères sont des chiffres). p>
N'essayez pas d'optimiser votre code avant de profiler. strong> surtout dans des langues comme Java. P>
Avez-vous considéré des expressions régulières? p>
Si la chaîne contient autre chose que - (au début), et 0-9 ou., c'est une chaîne. (Note - Cela ignore l'internationalisation et la notation scientifique - sont-ils des problèmes?) P>
Sinon, il contient un., c'est un double. (Eh bien, vous devriez tester uniquement une seule., Mais ceci est un début) p>
Sinon, c'est une longue. p>
Sortie de la paranoïa, je pourrais toujours vérifier les exceptions, mais cela pourrait être un moyen plus rapide. p>
Note ajoutée Je suppose que le test de la regex est plus rapide que de jeter des exceptions sur les différentes routines d'analyse, mais cela pourrait ne pas être vrai. Vous devriez faire des tests. P>
J'étais sous l'impression que Regex serait plus lente, mais il suffit d'un exercice d'analyse comparative rapide qui correspond à Longs et en double à l'aide de modèles de regex et qu'il s'avère légèrement plus rapide. J'ai ajouté ce code à ma question avec les résultats de référence.
Une possibilité est java.io.streamtokenizer: Il peut s'agir de sorte d'utiliser cependant. p> p>
Si vous n'avez pas besoin de vous inquiéter de votre Longs code> étant négatif, vous pouvez probablement utiliser
numeryutils.isdigits () code> et
numérotutils.isnumber () < / Code> de la bibliothèque Apache Commons Lang.
Si vous utilisez
java 7 code> que de regarder blocs multi-captures-pour-exceptions
@Ranrag Je ne vois pas comment les blocs multi-captures sont utiles dans cette situation. La deuxième capture est à l'intérieur de - pas après - le premier bloc de capture.
Vous avez raison, je n'ai pas vu ça.
@Dawood Si la plupart des chaînes commencent par des lettres, vous pourriez gagner un peu plus de vitesse en faisant d'abord un test rapide et sale sur le premier personnage, par exemple. thestring.charat (0)> = 'a'. En supposant ASCII.