2015-03-25 1 views
5

Par souci de cette question, supposons que j'ai un String qui contient les valeurs Two;.Three;.Four(and so on) mais les éléments sont séparés par ;..Le moyen le plus efficace de scinder la chaîne en Java

Maintenant, je sais qu'il ya des multiples façons de diviser une chaîne telle que split() et StringTokenizer (être plus vite un et fonctionne bien) mais mon fichier d'entrée est d'environ 1 Go et je cherche quelque chose un peu plus efficace que StringTokenizer.

Après quelques recherches, indexOf et substring sont assez efficaces mais les exemples ont seulement des délimiteurs simples ou les résultats retournent seulement un seul mot/élément.

Exemple de code utilisant indexOf et substring:

String s = "quick,brown,fox,jumps,over,the,lazy,dog"; 
int from = s.indexOf(','); 
int to = s.indexOf(',', from+1); 
String brown = s.substring(from+1, to); 

Les travaux ci-dessus pour l'impression brown mais comment puis-je utiliser indexOf et substring pour diviser une ligne avec plusieurs délimiteurs et afficher tous les éléments ci-dessous.

sortie Expected

Two 
Three 
Four 
....and so on 
+1

Qu'essayez-vous d'accomplir? Avez-vous fait des tests sur différents cas de test et voyez lequel est "efficace"? –

+0

Il ya aussi une surcharge 'indexOf' qui prend' String' ... – yshavit

+0

vous voulez dire ceci 'string.replaceAll ("; \\. "," \ N ");'? –

Répondre

2

est plus rapide que StringBuilder.

public static void main(String[] args) { 

    String str = "This is String , split by StringTokenizer, created by me"; 
    StringTokenizer st = new StringTokenizer(str); 

    System.out.println("---- Split by space ------"); 
    while (st.hasMoreElements()) { 
     System.out.println(st.nextElement()); 
    } 

    System.out.println("---- Split by comma ',' ------"); 
    StringTokenizer st2 = new StringTokenizer(str, ","); 

    while (st2.hasMoreElements()) { 
     System.out.println(st2.nextElement()); 
    } 
} 
3

Si vous voulez le nec plus ultra en matière d'efficacité, je ne voudrais pas utiliser Strings du tout, et encore moins les séparer. Je ferais ce que les compilateurs font: traiter le fichier un caractère à la fois. Utilisez un BufferedReader avec une grande taille de tampon, disons 128kb, et lisez un char à la fois, en les accumulant dans un StringBuilder jusqu'à ce que vous obteniez un ; ou un terminateur de ligne.

+0

Okay va essayer et rendre compte. Merci – user92038111111

+0

@AvinashRaj Votre commentaire n'a rien à voir avec ma réponse. Ne publiez pas de commentaires non pertinents ici. – EJP

+0

@AvinashRaj Cela n'a rien de plus à voir avec ma réponse que votre commentaire précédent. – EJP

0

Ceci est la méthode I utilise pour diviser de grande taille (1 Go +) des fichiers séparés par des tabulations. Il est limité à un délimiteur char pour éviter toute surcharge des appels de méthodes supplémentaires (qui peuvent être optimisés par le moteur d'exécution), mais il peut être facilement converti en String-délimité. Je serais intéressé si quelqu'un peut trouver une méthode plus rapide ou des améliorations sur cette méthode.

public static String[] split(final String line, final char delimiter) 
{ 
    CharSequence[] temp = new CharSequence[(line.length()/2) + 1]; 
    int wordCount = 0; 
    int i = 0; 
    int j = line.indexOf(delimiter, 0); // first substring 

    while (j >= 0) 
    { 
     temp[wordCount++] = line.substring(i, j); 
     i = j + 1; 
     j = line.indexOf(delimiter, i); // rest of substrings 
    } 

    temp[wordCount++] = line.substring(i); // last substring 

    String[] result = new String[wordCount]; 
    System.arraycopy(temp, 0, result, 0, wordCount); 

    return result; 
}