jacknad
jacknad

Reputation: 13739

How can a StringBuilder best be converted to a String[]?

The following code sort of works, but fixes the number of elements in String[]. Is there a way to make a String[] add the number of elements needed dynamically?

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;
}

Upvotes: 9

Views: 46746

Answers (6)

Ashwin H
Ashwin H

Reputation: 723

String myLocation = builder.toString();

Upvotes: 0

Tuhin
Tuhin

Reputation: 1

StringBuilder t= new StringBuilder();

String s= t.toString();

Upvotes: -4

x4u
x4u

Reputation: 14077

You can use a recursive implementation to use the program stack as a temporary array.

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;
}

Upvotes: 1

Alexander Pogrebnyak
Alexander Pogrebnyak

Reputation: 45576

To dynamically grow array, use ArrayList<String>, you can even convert the result to String[] if that's what your API requires.

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( ) ] );

That said, for your purposes use split as suggested by others

Upvotes: 4

Pablo Santa Cruz
Pablo Santa Cruz

Reputation: 181290

You can use String's method split to do that in one line.

Upvotes: 2

Jon Skeet
Jon Skeet

Reputation: 1500535

So you're just trying to split on tab? How about:

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

Note that split takes a regular expression pattern - so don't expect split(".") to split just on dots, for example :)

Upvotes: 20

Related Questions