В JavaScript мы можем разделить строку на каждом 3-м символе
"foobarspam".match(/.{1,3}/g)
Я пытаюсь понять, как это сделать на Java. Любые указатели?
В JavaScript мы можем разделить строку на каждом 3-м символе
"foobarspam".match(/.{1,3}/g)
Я пытаюсь понять, как это сделать на Java. Любые указатели?
Вы можете сделать это следующим образом:
String s = "1234567890";
System.out.println(java.util.Arrays.toString(s.split("(?<=\\G...)")));
который производит:
[123, 456, 789, 0]
Регулярное выражение (?<=\G...)
соответствует пустой строке с последним соответствием (\G
), за которой следует три символа (...
) до it ((?<= )
)
Java не предоставляет очень полнофункциональные утилиты расщепления, поэтому библиотеки Guava:
Iterable<String> pieces = Splitter.fixedLength(3).split(string);
Посмотрите Javadoc для Splitter; он очень мощный.
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
for (String part : getParts("foobarspam", 3)) {
System.out.println(part);
}
}
private static List<String> getParts(String string, int partitionSize) {
List<String> parts = new ArrayList<String>();
int len = string.length();
for (int i=0; i<len; i+=partitionSize)
{
parts.add(string.substring(i, Math.min(len, i + partitionSize)));
}
return parts;
}
}
В качестве дополнения к Bart Kiers ответьте, что я хочу добавить, что это возможно вместо использования трех точек ...
в выражении регулярного выражения, которые представляют три символа вы можете написать .{3}
, который имеет то же значение.
Затем код будет выглядеть следующим образом:
String bitstream = "00101010001001010100101010100101010101001010100001010101010010101";
System.out.println(java.util.Arrays.toString(bitstream.split("(?<=\\G.{3})")));
С этим было бы легче изменить длину строки, и создание функции теперь разумно с переменной длиной строки ввода. Это может быть сделано следующим образом:
public static String[] splitAfterNChars(String input, int splitLen){
return input.split(String.format("(?<=\\G.{%1$d})", splitLen));
}
Пример в IdeOne: http://ideone.com/rNlTj5
Это поздний ответ, но я все равно размещаю его для любых новых программистов:
Если вы не хотите использовать регулярные выражения и не хотите полагаться на стороннюю библиотеку, вы можете использовать этот метод вместо этого, который занимает между 89920 и 100113 наносекунды в 2,80 ГГц CPU (менее миллисекунды). Это не так красиво, как пример Саймона Никерсона, но он работает:
/**
* Divides the given string into substrings each consisting of the provided
* length(s).
*
* @param string
* the string to split.
* @param defaultLength
* the default length used for any extra substrings. If set to
* <code>0</code>, the last substring will start at the sum of
* <code>lengths</code> and end at the end of <code>string</code>.
* @param lengths
* the lengths of each substring in order. If any substring is not
* provided a length, it will use <code>defaultLength</code>.
* @return the array of strings computed by splitting this string into the given
* substring lengths.
*/
public static String[] divideString(String string, int defaultLength, int... lengths) {
java.util.ArrayList<String> parts = new java.util.ArrayList<String>();
if (lengths.length == 0) {
parts.add(string.substring(0, defaultLength));
string = string.substring(defaultLength);
while (string.length() > 0) {
if (string.length() < defaultLength) {
parts.add(string);
break;
}
parts.add(string.substring(0, defaultLength));
string = string.substring(defaultLength);
}
} else {
for (int i = 0, temp; i < lengths.length; i++) {
temp = lengths[i];
if (string.length() < temp) {
parts.add(string);
break;
}
parts.add(string.substring(0, temp));
string = string.substring(temp);
}
while (string.length() > 0) {
if (string.length() < defaultLength || defaultLength <= 0) {
parts.add(string);
break;
}
parts.add(string.substring(0, defaultLength));
string = string.substring(defaultLength);
}
}
return parts.toArray(new String[parts.size()]);
}