7
votes

Comment vérifier si et quel type de numéro de numéro une chaîne une chaîne?

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: XXX PRE>

EDIT: STRAND> P>

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


4 commentaires

Si vous utilisez java 7 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.


6 Réponses :


2
votes

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.

Si vous avez plus de 3 types possibles, vous allez avoir un nid 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.


2 commentaires

Si je vous ai bien compris, alors l'analyse de l'ordre de fréquence de l'événement ne fonctionnera pas car String Les représentations seraient un superset strict de double , ce qui serait à son tour un superset strict de long . 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.



1
votes

Vous pourriez être en mesure d'obtenir une certaine amélioration (surtout si vous pouvez exclure la notation scientifique, _g. 1e12 ) en vérifiant simplement les non-chiffres pour détecter une longue.

long.parselong () 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.

n'oubliez pas les signes moins, si ceux-ci sont possibles dans vos données ...

Doubles sont plus difficiles car 654.1236871 est valide, mais 654.12.36.87 ... 1 n'est pas, bien qu'ils contiennent le même ensemble de caractères. Un analysement complet est probablement nécessaire.


0 commentaires

1
votes

Votre code a l'air bien.

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).

N'essayez pas d'optimiser votre code avant de profiler. surtout dans des langues comme Java.


0 commentaires

3
votes

Avez-vous considéré des expressions régulières?

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?)

Sinon, il contient un., c'est un double. (Eh bien, vous devriez tester uniquement une seule., Mais ceci est un début)

Sinon, c'est une longue.

Sortie de la paranoïa, je pourrais toujours vérifier les exceptions, mais cela pourrait être un moyen plus rapide.

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.


1 commentaires

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.



1
votes

Une possibilité est java.io.streamtokenizer: xxx

Il peut s'agir de sorte d'utiliser cependant.


0 commentaires

0
votes

Si vous n'avez pas besoin de vous inquiéter de votre Longs étant négatif, vous pouvez probablement utiliser numeryutils.isdigits () et numérotutils.isnumber () < / Code> de la bibliothèque Apache Commons Lang. XXX


0 commentaires