日期:2014-05-20  浏览次数:20653 次

求快速分割字符串的函数
本人现抛砖引玉,贴一段代码。
private static String[] SplitTextAll(String line,String splitText)
{
int position1 = line.indexOf(splitText);  

int length = splitText.length();
List<String> arr = new ArrayList<String>();

int positionstart = - length;
int positionend = position1;

while (positionend>=0)
{
positionend = line.indexOf(splitText, positionstart + length);
if(positionend==-1)
{
break;
}

arr.add(line.substring(positionstart + length, positionend));
positionstart = positionend;

}
arr.add(line.substring(positionstart + length));
return arr.toArray(new String[arr.size()]);

}
当前代码鲁棒性还有待提高。权当献丑,上面代码速度是JDK6自带split的4-5倍。求速度更快的代码。现程序的瓶颈在字符分割,谢谢!
------解决方案--------------------

 public String[] split(String regex, int limit) {
        /* fastpath if the regex is a
         (1)one-char String and this character is not one of the
            RegEx's meta characters ".$
------解决方案--------------------
()[{^?*+\\", or
         (2)two-char String and the first char is the backslash and
            the second is not the ascii digit or ascii letter.
         */
        char ch = 0;
        if (((regex.value.length == 1 &&
             ".$
------解决方案--------------------
()[{^?*+\\".indexOf(ch = regex.charAt(0)) == -1) 
------解决方案--------------------

             (regex.length() == 2 &&
              regex.charAt(0) == '\\' &&
              (((ch = regex.charAt(1))-'0')
------解决方案--------------------
('9'-ch)) < 0 &&
              ((ch-'a')
------解决方案--------------------
('z'-ch)) < 0 &&
              ((ch-'A')
------解决方案--------------------
('Z'-ch)) < 0)) &&
            (ch < Character.MIN_HIGH_SURROGATE 
------解决方案--------------------

             ch > Character.MAX_LOW_SURROGATE))
        {
            int off = 0;
            int next = 0;
            boolean limited = limit > 0;
            ArrayList<String> list = new ArrayList<>();
            while ((next = indexOf(ch, off)) != -1) {
                if (!limited 
------解决方案--------------------
 list.size() < limit - 1) {
                    list.add(substring(off, next));
                    off = next + 1;
                } else {    // last one
                    //assert (list.size() == limit - 1);
                    list.add(substring(off, value.length));
                    off = value.length;
                    break;
                }