2010-08-12 4 views
9

Le tri de code suivant fonctionne, mais fixe le nombre d'éléments dans String []. Y at-il un moyen de faire un String [] ajouter le nombre d'éléments nécessaires dynamiquement?Comment un StringBuilder peut-il être mieux converti en String []?

private static StringBuilder names = new StringBuilder(); 
... 
public String[] getNames() { 
    int start = 0; 
    int end = 0; 
    int i = 0; 
    String[] nameArray = {"","","",""}; 

    while (-1 != end) { 
     end = names.indexOf(TAB, start);    
     nameArray[i++] = names.substring(start, end); 
     start = ++end; // The next name is after the TAB 
    } 
    return nameArray; 
} 
+0

Il serait vraiment utile si vous expliquiez * comment * vous voulez que le texte soit brisé. J'ai fait des hypothèses basées sur le code, mais une description aurait été bien. –

Répondre

20

Alors vous essayez simplement de diviser sur un onglet? Que diriez-vous:

return names.toString().split(TAB); 

Notez que split prend un modèle d'expression régulière - donc ne vous attendez pas split(".") de diviser seulement sur des points, par exemple :)

+6

Ma réponse est vouée à l'échec! Great @JonSkeet a répondu trois secondes avant que je l'ai fait. :-) Lisez votre livre Jon. C'est génial. –

+2

Parfait! Seulement besoin de cette ligne. Et oui, TAB est \ t. Merci un million. – jacknad

2

Vous pouvez utiliser la méthode de chaîne split de le faire dans un ligne.

4

Pour augmenter dynamiquement le tableau, utilisez ArrayList<String>, vous pouvez même convertir le résultat en String[] si c'est ce que votre API requiert.

ArrayList<String> namesList = new ArrayList<String>(); 

while (-1 != end) { 
    end = names.indexOf(TAB, start);    
    namesList.add(names.substring(start, end)); 
    start = ++end; // The next name is after the TAB 
} 

return namesList.toArray(new String[ namesList.size() ]); 

Cela dit, pour vos fins utiliser split comme suggéré par d'autres

+0

Merci un million! Grande aide. – jacknad

1

Vous pouvez utiliser une implémentation récursive pour utiliser la pile de programme comme un tableau temporaire.

public String[] getNames() 
{ 
    return getNamesRecursively(names, 0, TAB, 0); 
} 

private static String[] getNamesRecursively(StringBuilder str, int pos, String delimiter, int cnt) 
{ 
    int end = str.indexOf(delimiter, pos); 
    String[] res; 
    if(end >= 0) 
     res = getNamesRecursively(str, end + delimiter.length(), delimiter, cnt + 1); 
    else 
    { 
     res = new String[ cnt + 1 ]; 
     end = str.length(); 
    } 
    res[ cnt ] = str.substring(pos, end); 
    return res; 
} 
+0

Impractical. Si l'entrée StringBuilder est assez grande, vous déborderez la pile. –

-4
StringBuilder t= new StringBuilder(); 

String s= t.toString(); 
0

chaîne MyLocation = builder.toString();

Questions connexes