你可以用一個單一的分裂做到這一點(當然,這可能不是最有效的運行,但這是簡潔,較小的代碼編寫):
String[] arr = str.split("(?<=\\G..)");
,然後用Arrays#asList()
方法得到List<String>
。
正則表達式模式在前面有2個字符的空白處分開 - ..
,但忽略之前匹配中已考慮的字符 - \\G
。主播\\G
匹配前一場比賽結束的位置。
String str = "00122334455667788990875645346787659870984780";
String[] arr = str.split("(?<=\\G..)");
System.out.println(Arrays.asList(arr));
打印:
[00, 12, 23, 34, 45, 56, 67, 78, 89, 90, 87, 56, 45, 34, 67, 87, 65, 98, 70, 98, 47, 80]
這裏是如何拆分您的字符串進行:
" 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
參考:
如果運行時性能是一個問題,那麼你就可以用簡單的循環去:
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);
但是你可以自己查一下,正則表達式拆分是否是真的大型字符串的性能瓶頸,並且適當地對它們進行基準測試。
我測試了兩種方法 - 分割和循環。正如所期望的,循環比分割字符串長度幾乎高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 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
如果有人認爲該基準測試結果是有缺陷的,那麼請記下它的意見。
什麼是您的效率標準?性能?簡明? – assylias
它應該能夠儘快處理這樣的大字符串。 :-) – dreamer