2013-03-05 2 views
3

Je lis de nombreux fichiers texte volumineux et je dois vérifier si chaque extrait de texte contient une double valeur ou non. Le code regex que j'utilise actuellement fait que mon programme tourne très lentement car au total je vérifie 10 milliards de chaînes. Je sais qu'en raison du grand nombre de chaînes que je vérifie, mon programme doit fonctionner lentement. Mais existe-t-il un moyen plus efficace et plus rapide de vérifier si une chaîne est une valeur double, diminuant ainsi l'exécution du programme? MerciJava - Le moyen le plus rapide de vérifier si une chaîne contient une double valeur

if (string[i].matches(".*\\d.*")) { 

..... 
} 

En outre, les chaînes du fichier texte sont lus dans un tableau avant que je les vérifie donc temps de lecture ne perd pas constamment le fichier texte.

+1

'Est-ce matcher.find ("\\ d")'. Votre regex est lente car tenter d'exécuter la regex '. * \\ d. *' A de mauvaises performances - vous avez deux '. *' 'Qui peuvent tenter de prendre n'importe quelle longueur de 0 à N caractères. 'find' sur une regex va chercher à partir de chaque endroit. – Patashu

+0

Sauf si vous avez besoin des chaînes en mémoire pour une autre raison, vous réalisez des gains de performance ambigus en lisant les chaînes en mémoire au prix de l'utilisation de la mémoire stockant ces chaînes. Il pourrait être utile d'essayer d'éviter de lire les chaînes dans le tableau avant de vérifier. –

Répondre

4

Utilisez les Pattern et Matcher classes:

public static final Pattern DOUBLE = Pattern.compile("\\d"); 

... 

if (DOUBLE.matcher(string[i]).find()) { 
    ... 
} 
+2

Vous devriez aussi utiliser find au lieu de matches et '\\ d' au lieu de'. * \\ d. * 'Pour la vitesse – Patashu

+1

@Patashu Point pris, merci. – arshajii

0

Cette expression

"\\d+\\.\\d+([eE]\\d+)?" 

permet 1.1 ou 1.1e1 ou 1.1E1 formats.

Notez que Java permet plus ou par exemple 1. 1. ou 0x1p1

Questions connexes