dre*_*mer 1 java string parsing
我收到了一个字符串:
00122334455667788990875645346787659870984780...
Run Code Online (Sandbox Code Playgroud)
上面给出的字符串大小将始终是偶数.我必须实现一个方法,它将返回String的Arraylist,其中每个元素将包含2个字符.例如对于上面的字符串:
1st position of arraylist will contain: 00
2nd: 12
3rd: 23
...
Run Code Online (Sandbox Code Playgroud)
我自己试图实现它,这就是我的函数的样子:
private static ArrayList<String> getArrayListFrom(String data) {
if(data.length()%2==0){
ArrayList<String> aList = new ArrayList<String>();
char[] dArray = data.toCharArray();
//logic here.
for(int i = 0; i < dArray.length + 2; i = i+2){
if(i != 0){
aList.add(dArray[i-2]+""+dArray[i-1]);
}
}
return aList;
}else{
System.out.println("Invalid data.");
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
此 URL表明在这种情况下,简单迭代更有效.你们同意吗?
Roh*_*ain 10
你可以通过一次拆分来做到这一点(嗯,这在运行时可能不是最有效的,但这是简洁的,更少的代码编写):
String[] arr = str.split("(?<=\\G..)");
Run Code Online (Sandbox Code Playgroud)
然后获取List<String>使用Arrays#asList()方法.
正则表达式模式在前面有2个字符的空白区域上分割 - ..但忽略前一个匹配中已考虑过的字符 - \\G.锚点\\G匹配上一场比赛结束的位置.
String str = "00122334455667788990875645346787659870984780";
String[] arr = str.split("(?<=\\G..)");
System.out.println(Arrays.asList(arr));
Run Code Online (Sandbox Code Playgroud)
打印:
[00, 12, 23, 34, 45, 56, 67, 78, 89, 90, 87, 56, 45, 34, 67, 87, 65, 98, 70, 98, 47, 80]
Run Code Online (Sandbox Code Playgroud)
以下是对字符串进行拆分的方法:
" 00 1 2 2334455667788990875645346787659870984780" (whitespaces represent empty string)
// | | |
// split, no-split, split -> gives 12
// | | | |
// \ / \ /
// gives 00 as the preceding two characters are `1` and `0`.
// but 0 is already considered for the previous empty string
Run Code Online (Sandbox Code Playgroud)
参考:
如果运行时性能是一个问题,那么您可以使用简单的循环:
String str = "00122334455667788990875645346787659870984780";
List<String> list = new ArrayList<String>();
for (int i = 0; i < str.length(); i += 2) {
list.add(str.substring(i, i + 2));
}
System.out.println(list);
Run Code Online (Sandbox Code Playgroud)
但是你可以自己检查,正则表达式拆分是否真的是大字符串的性能瓶颈,并适当地对它们进行基准测试.
我对两种方法进行了基准测试 - 分裂和循环.并且正如预期的循环效率几乎是分裂的效率的4-5倍1000.
public static void usingSplit(String str) {
String[] arr = str.split("(?<=\\G..)");
List<String> list = Arrays.asList(arr);
}
public static void usingLoop(String str) {
List<String> list = new ArrayList<String>();
for (int i = 0; i < str.length(); i += 2) {
list.add(str.substring(i, i + 2));
}
}
// Warm up JVM
for (int i = 0; i < 1000000; ++i) {
usingSplit(str);
}
for (int j = 0; j < 1000000; j++) {
usingLoop(str);
}
long nano = System.nanoTime();
for (int i = 0; i < 1000000; ++i) {
usingSplit(str);
}
System.out.println("Time with usingSplit(): " + (System.nanoTime() - nano) * 1.0 / Math.pow(10, 9) + " Seconds");
nano = System.nanoTime();
for (int j = 0; j < 1000000; j++) {
usingLoop(str);
}
System.out.println("Time with usingLoop(): " + (System.nanoTime() - nano) * 1.0 / Math.pow(10, 9) + " Seconds");
Run Code Online (Sandbox Code Playgroud)
几次连续运行的输出:
Run 1:
Time with usingSplit(): 34.391315143 Seconds
Time with usingLoop(): 7.515221612 Seconds
Run 2:
Time with usingSplit(): 33.41518869 Seconds
Time with usingLoop(): 7.868896218 Seconds
Run Code Online (Sandbox Code Playgroud)
如果有人认为基准测试结果存在缺陷,请在评论中注明.
ArrayList<String> aList = new ArrayList<String>();
//logic here.
for(int i = 0; i < data.length(); i+=2){
aList.add(data.subString(i, i+2));
}
return aList;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
140 次 |
| 最近记录: |