2010-11-17 9 views
1

Existe-t-il un moyen simple d'analyser une chaîne de flottants en un tableau flottant? J'écris un importateur qui doit analyser un fichier ASCII pour extraire des valeurs et je me demande simplement s'il existe une façon plus simple de faire cela, puis de rechercher tous les espaces moi-même et d'utiliser Float.parseFloat(s) pour chaque valeur séparée par des espaces.Java analyse une chaîne de flottants dans un tableau flottant?

Par exemple, la chaîne est

1 0 4 0 26 110.78649609798859 39 249.34908705094128 47 303.06802752888359

Je veux créer un tableau de flotteurs comme:

[1, 0, 4, 0, 26, 110.78649609798859, 39, 249.34908705094128, 47, 303.06802752888359]

Merci pour l'aide!

Répondre

7

Utilisez un scanner [API]

Utilisez les méthodes à boucle Scanner#hasNextFloat et Scanner#nextFloat à travers et obtenir tous les flotteurs et les construire dans un tableau.

+0

La solution de Jasons est en réalité beaucoup plus efficace, Scanner est significativement plus lent. – skrat

4

Vous pouvez faire comme ce

diviser la chaîne

String [] split (chaîne regex) Splits cette chaîne autour des matches de l'expression régulière donnée.

String[] tabOfFloatString = bigStringWithAllFloats.split(regex); 

regex peut être l'espace, tabulation, virgule tout (avantage de regex est que vous pouvez combiner tout ce que vous voulez, j'utiliser dans mon lecteur xml "[- +:;]."); ensuite en boucle sur ce point et convertir en flotte

for(String s : tabOfFloatString){ 
    float res = Float.parseFloat(s); 
    //do whatever you want with the float 
} 
1

Si vous voulez juste un tableau de float, la voie facile est de diviser la chaîne:

String[] flostr = myString.split(" "); 
float[] floats = new float[flostr.length]; 

et itérer puis sur le tableau de chaînes, et analyser les valeurs flottantes simples. Vous pouvez également utiliser un scanner ou un StringTokenizer, placer toutes les valeurs dans une liste et créer un tableau à la fin.

1

Voici une solution Guava, mais je suis surpris de voir à quel point cela doit être compliqué. Peut-être que quelqu'un peut me donner une indication que la façon de le raccourcir:

public static float[] extractFloats(final String input){ 
    // check for null Strings 
    Preconditions.checkNotNull(input); 
    return Floats.toArray(Lists.transform(
     Lists.newArrayList(Splitter.on(Pattern.compile("\\s+")).split(
      input.trim())), new Function<String, Float>(){ 

      @Override 
      public Float apply(final String input){ 
       return Float.valueOf(input); 
      } 
     })); 
} 

Code d'essai:

String param = 
    "1 0 4 0 26 110.78649609798859 39 249.34908705094128 47 303.06802752888359"; 
float[] floats = extractFloats(param); 
System.out.println(Arrays.toString(floats)); 

Sortie:

[1,0, 0,0, 4,0, 0,0 26,0, 110,7865, 39,0, 249,34909, 47,0, 303.06802]

Questions connexes