0

将字符串转换为字符串数组的最快方法是什么(除以 2 个字符):
String input="127856";
字符串[] 输出={"12" , "78" , "56"};
目前我正在使用for但非常慢:

public static String[] mySplit(String input){
    List<String> res=new ArrayList<String>();
    for (int i = 0; i < input.length()-1; i+=2) {
        res.add("" + input.charAt(i) + "" + input.charAt(i+1));
    }
    String array[]=res.toArray(new String[0]);
    return array;
}
4

4 回答 4

1

如果您不想使用正则表达式,可以使用substring,这应该比字符串连接快得多:

public static String[] mySplit(String input){
    int len = input.length(), index = 0;

    // Arrays are faster than lists
    String[] array = new String[len/2+len%2];
    for (int i = 0; i < len-1; i+=2, index++) {
        array[index]=input.substring(i,i+2);
    }
    // To handle strings with an odd number of characters
    if(input.length()%2==1) {
        array[index]=input.substring(input.length()-1);
    }
    return array;
}

演示

于 2019-05-16T19:49:38.913 回答
1

函数的输出数组应包含输入长度元素的一半(例如out.lengthis input.length() / 2)。接下来,输出中的每个位置都从输出索引乘以 2 开始,并在比该索引多 1 处结束(但是互斥String.substring(int, int)的)。我认为编写函数的“最快”方式是这样的,

public static String[] mySplit(String input) {
    String[] out = new String[(1 + input.length()) / 2];
    for (int i = 0; i < out.length; i++) {
        out[i] = input.substring(i * 2, Math.min(2 + (i * 2), input.length()));
    }
    return out;
}
于 2019-05-16T19:53:53.487 回答
0

您也可以使用正则表达式:

public static String[] mySplit(String input){

  String[] output = input.split("(?<=\\G.{2})");
  return output;
}

正则表达式(?<=\G...)匹配一个空字符串,该字符串具有最后一个匹配项( ),其\G三个字符( ...) ( )。(?<= )

但是,时间复杂度是相同的。

于 2019-05-16T19:41:48.513 回答
0

使用标准库通常是最好的解决方案。java.lang.String提供了一种方法String[] split(String regex)。在正则表达式中,一个 . 代表一个字符,你想要2个字符,所以正则表达式是..

public static String[] mySplit(String input){
   String array[]=input.split("..");
   return array;
}

由于它未经测试,我无法告诉你如果字符串中的字符数是奇数会发生什么。

编辑:就像未经测试的代码一样,正则表达式是错误的。请无视我的回答。

于 2019-05-16T19:47:51.177 回答