如何将一个 StringBuilder 最好地转换为 String[]?

9
以下代码有点用,但是它固定了String[]中元素的数量。有没有一种方法可以使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;
}

如果您能解释一下您希望文本如何分割,那将非常有帮助。我已经根据代码做出了一些假设,但是一个描述会更好。 - Jon Skeet
6个回答

20

所以你只是想在制表符上进行拆分吗?那么这样如何:

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

注意split方法需要传入一个正则表达式 - 所以不要指望split(".")仅在点上进行分割,例如 :)


6
我的回答注定要失败了! @JonSkeet 在我之前三秒钟就回答了。 :-) Jon,我读了你的书,太棒了。 - Pablo Santa Cruz
2
太好了!只需要这一行代码。是的,TAB键就是 \t。非常感谢。 - jacknad

4

要动态增长数组,请使用ArrayList<String>,如果您的API需要,甚至可以将结果转换为String[]

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

话虽如此,对于您的用途,请使用其他人建议的split


2

您可以使用String类的方法split在一行中完成此操作。


1

你可以使用递归实现,将程序栈用作临时数组。

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

不切实际。如果输入的 StringBuilder 足够大,你会溢出堆栈。 - Stephen C

0

String myLocation = builder.toString();


-4
StringBuilder t= new StringBuilder();

String s= t.toString();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接