9

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

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

将打印[ab, #, cd, #, efg, #]到控制台。到目前为止,我已经将其拆分为这样,但我的方式留下了尴尬的空间,其中 2 个分隔符连续排列,或者分隔符位于输入的开头。

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

当我在我的测试主程序中使用该方法时,我得到输出 [ab, #, cd, #, efg, #, , , , ]。所以我不知道如何修复它的间距,我还需要能够允许我的代码目前无法处理的多个分隔符。

另外我知道这段代码现在真的很草率,只是想在优化之前放下概念。

4

9 回答 9

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

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

于 2013-10-12T23:56:58.720 回答
2

我认为您的问题是您分配的 storeSplit[] 长度比您需要的要长。如果允许使用 ArrayList,请使用它来累积结果(并使用 ArrayList.toArray() 方法获取函数的最终返回值)。

如果您不能使用 ArrayList,那么您需要在返回之前截断您的数组(您的计数器变量将用于确定正确的长度)。为此,您需要分配一个正确长度的数组,然后使用 System.arraycopy 填充它。使用 ArrayList 更简单,但我不知道您分配的确切要求。

于 2013-10-12T23:19:53.673 回答
1

正如评论中所指出的,问题在于您将数组大小设置为字符串的长度。相反,您希望将其设置为分隔符数量的两倍。然后,相应地调整:

  1. 如果第一个字符分隔符,则减一个,
  2. 如果最后一个字符不是分隔符,则添加一个。
// Calculate number of delimiters in str
int delimiters = str.length() - str.replaceAll(regex, "").length();
// Calculate array size
int arraySize = (delimiters * 2) + (str.startsWith(regex) ? -1 : 0);
arraySize = str.endsWith(regex) ? arraySize : arraySize + 1;
String[] storeSplit = new String[arraySize];
于 2013-10-12T23:20:57.887 回答
0

看起来您遇到的间距问题是因为您的 storeSplit 数组是固定长度的。

假设您的输入字符串长度为 5 个字符;您的 storeSplit 数组将有 5 个“空格”。该输入字符串可能只包含一个分隔符;例如“ab#ef”,创建 3 个子字符串 - “ab”、“#”和“ef”。

为避免这种情况,请改为创建一个列表:

List<String> storeSplit = new ArrayList<String>();

然后,不要增加计数器并放入文本,而是添加到列表中:

storeSplit.add(""+str.charAt(i));

代替

storeSplit[counter] = ""+str.charAt(i);
于 2013-10-12T23:19:40.977 回答
0

这是我要做的:

String[] test1 = "ab#cd#efg#".split("#");//splits the string on '#'
String result="";
for(String test:test1)//loops through the array
    result+="#"+test;//adds each member to the array putting the '#' in front of each one
System.out.println(result.substring(1));//prints out the string minus the first char, which is a '#'

我希望这有帮助。

于 2013-10-13T01:10:29.257 回答
0
    public List<String> split(String str , String regex) {
    char c ;
    int count=0;
    int len = regex.length();
    String temp;
    List<String> result = new ArrayList<>();
    for(int i=0;i<str.length();i++) {
        //System.out.println(str.substring(i, i+len-1));
        temp = str.substring(i, i+len>str.length()?str.length():i+len);
        if(temp.compareTo(regex) == 0) {
            result.add(str.substring(count , i));
            count = i+len;
        }
    }
    result.add(str.substring(count, str.length()));
    return result;
}
于 2020-02-13T21:46:16.170 回答
0

我已经使用递归来解决它。

static void splitMethod(String str, char splitChar, ArrayList<String> list) {
        String restOfTheStr = null;
        StringBuffer strBufWord = new StringBuffer();
        int pos = str.indexOf(splitChar);
        if(pos>=0) {
            for(int i = 0; i<pos; i++) {
                strBufWord.append(str.charAt(i));
            }
            String word = strBufWord.toString();
            list.add(word);
            restOfTheStr = str.substring(pos+1);//As substring includes the 
            //splitChar, we need to do pos + 1
            splitMethod(restOfTheStr, splitChar, list);
        }
        if(pos == -1) {
            list.add(str);
            return;
        }

    }

利用:

ArrayList<String> list= new ArrayList<String>();//in this list
    //the words will be stored
    String str = "My name is Somenath";
    splitMethod(str,' ', list );
于 2019-01-27T23:58:53.087 回答
0

下面是方法

public static List<String> split(String str, String demarcation) {
    ArrayList<String> words = new ArrayList<>();
    int startIndex = 0, endIndex;

    endIndex = str.indexOf(demarcation, startIndex);

    while (endIndex != -1) {
        String parts = str.substring(startIndex, endIndex);

        words.add(parts);

        startIndex = endIndex + 1;
        endIndex = str.indexOf(demarcation, startIndex);

    }

    // For the last words
    String parts = str.substring(startIndex);

    words.add(parts);
    return words;
}
于 2019-08-12T13:24:46.423 回答
0

这是我的代码的输出,只需单击它 包演示;

public class demo8 {

static int count = 0;
static int first = 0;
static int j = 0;

public static void main(String[] args) {

    String s = "ABHINANDAN TEJKUMAR CHOUGULE";
    int size = 0;

    for (int k = 0; k < s.length(); k++) {
        if (s.charAt(k) == ' ') {
            size++;
        }

    }

    String[] last = new String[size + 1];

    for (int i = 0; i < s.length(); i++) {
        int temp = s.length();

        if (i == s.length() - 1) {
            last[j] = s.substring(first, i + 1);
        }

        if (s.charAt(i) == ' ') {
            last[j] = s.substring(first, i);
            j++;
            first = i + 1;

        }

    }
    for (String s1 : last) {
        System.out.println(s1);
    }
[I tested my code and output is also attached with it ...!][1]}}
于 2016-11-30T15:01:29.877 回答