Splitting a string without using String.split () - and returning delimiters

String s = "ab#cd#ef#gh#";
String regex = "#";

char [] sChar = s.toCharArray();
char [] regexChar = regex.toCharArray();

int count = 1;
for (int i = 0; i < regexChar.length; i++){
    for (int j = 0; j < sChar.length; j++){
        if (regexChar [i] == sChar[j]){
            count += 2;
        }
    }
}

String [] splitS = new String [count];
String temp;
for (int k = 0; k < count; k++){
    temp = "";
    for (int i = 0; i < regexChar.length; i++){
        for (int j = 0; j < sChar.length; j++){
            if (regexChar[i] == sChar[j]){
                temp = Character.toString(regexChar[i]);
            }
            else {
                temp = temp + Character.toString(sChar[j]);
            }
        }
    }
    splitS[k] = temp;
}

      

This is my code so far, but it gives me splitS[#,#,#,#,#,#,#,#]

. However, it should be splitS[ab,#,cd,#,ef,#,gh,#]

. Can anyone tell me why this is being done?

+3


source to share


2 answers


I think the comments about using existing standard classes should be seriously considered, but just for fun, but what about:



import java.util.ArrayList;

class Splitter{
    static ArrayList<String> tokenize(String subject, String pattern)
    {
        ArrayList<String> tokens = new ArrayList<>();

        int tokenOff = 0;
        while(true)
        {
            int tokenPos = subject.indexOf(pattern, tokenOff);
            if(tokenPos == -1){ break; }
            String tok = subject.substring(tokenOff, tokenPos);

            addToken(tokens, tok);
            addToken(tokens, pattern);

            tokenOff = (tokenPos + pattern.length());
        }
        // Add any remaining characters
        addToken(tokens, subject.substring(tokenOff));

        return tokens;
    }

    static void addToken(ArrayList<String> list, String tok)
    {
        if(tok.length() > 0){ list.add(tok); }
    }

    public static void main(String args[])
    {
        String subject, pattern;
        ArrayList<String> tokens;

        subject = "ab#cd#ef#gh#"; 
        pattern = "#";
        tokens = tokenize(subject, pattern);
        System.out.println(tokens); // [ab, #, cd, #, ef, #, gh, #]

        subject = "ab##cd##ef##gh##"; 
        pattern = "##";
        tokens = tokenize(subject, pattern);
        System.out.println(tokens); // [ab, ##, cd, ##, ef, ##, gh, ##]

        subject = "ab##cd##ef##gh##ij"; 
        pattern = "##";
        tokens = tokenize(subject, pattern);
        System.out.println(tokens); // [ab, ##, cd, ##, ef, ##, gh, ##, ij]

        subject = "ab##cd#ef#gh##ij"; 
        pattern = "##";
        tokens = tokenize(subject, pattern);
        System.out.println(tokens); // [ab, ##, cd#ef#gh, ##, ij]
    }
}

      

+2


source


What you need. Got rid of unnecessary and unsafe shit.



public static String[] split(String s, String regex) {
    List<String> result = new ArrayList<>();
    int beginning = 0;
    for (int i = 0; i < s.length(); i++) {
        if (s.substring(i).startsWith(regex)) {
            // if you need splitter in output array
            if (!result.isEmpty()) {  
                result.add(regex);
            }
            result.add(s.substring(beginning, i));

            // Move forward for splitter size
            i += regex.length();
            beginning = i;
        }
    }

    // Optionally if you really need an array instead
    String[] splitS = new String[result.size()];
    result.toArray(splitS);
    return splitS;
}

      

+1


source







All Articles