Java,编写自己的split string方法

Exc*_*ion 9 java string split

我需要能够编写自己的分割字符串方法,以便输入像

String[] test1 = mySplit("ab#cd#efg#", "#");
System.out.println(Arrays.toString(test1));
Run Code Online (Sandbox Code Playgroud)

将打印[ab, #, cd, #, efg, #]到控制台.到目前为止,我已经让它像那样拆分但是我的方式留下了两个分隔符连续的尴尬空间,或者分隔符位于输入的开头.

public static String[] mySplit(String str, String regex)
{
    String[] storeSplit = new String[str.length()];
    char compare1, compare2;
    int counter = 0;

    //Initializes all the string[] values to "" so when the string
    //and char concatonates, 'null' doesn't appear.
    for(int i=0; i<str.length(); i++) {
        storeSplit[i] = "";
    }

    //Puts the str values into the split array and concatonates until
    //a delimiter is found, then it moves to the next array index.
    for(int i=0; i<str.length(); i++) {
        compare1 = str.charAt(i);
        compare2 = regex.charAt(0);

            if(!(compare1 == compare2)) {
                storeSplit[counter] += ""+str.charAt(i);
            } else {
                counter++;
                storeSplit[counter] = ""+str.charAt(i);
                counter++;
            }
    }
    return storeSplit;
}
Run Code Online (Sandbox Code Playgroud)

当我在Test main中使用该方法时,我得到输出[ab,#,cd,#,efg,#,,,,].所以我迷失了如何修复它的间距,我还需要能够允许我的代码当前无法处理的多个分隔符.

另外我知道这个代码目前非常草率,只是试图在优化之前放下概念.

Agi*_*Pro 5

问题很简单,你有一个偏移量来寻找新的匹配项(pos),另一个显示你找到匹配项的最后一个地方的结尾(开始)。

public static String[] mySplit(String str, String regex)
{
    Vector<String> result = new Vector<String>;
    int start = 0;
    int pos = str.indexOf(regex);
    while (pos>=start) {
        if (pos>start) {
            result.add(str.substring(start,pos));
        }
        start = pos + regex.length();
        result.add(regex);
        pos = str.indexOf(regex,start); 
    }
    if (start<str.length()) {
        result.add(str.substring(start));
    }
    String[] array = result.toArray(new String[0]);
    return array;
}
Run Code Online (Sandbox Code Playgroud)

这避免了额外的循环并且每个字符只复制一次。实际上,由于子字符串的工作方式,不会复制任何字符,只会创建指向原始字符缓冲区的小字符串对象。根本不进行字符串的串联,这是一个重要的考虑因素。