Разбиение строки на каждый n-й символ
в JavaScript это то, как мы можем разделить строку на каждый 3-й символ
"foobarspam".match(/.{1,3}/g)
Я пытаюсь выяснить, как это сделать в Java. Какие-нибудь указатели?
6 ответов:
вы могли бы сделать это вот так:
String s = "1234567890"; System.out.println(java.util.Arrays.toString(s.split("(?<=\G...)")));
что производит:
[123, 456, 789, 0]
регулярное выражение
(?<=\G...)
соответствует пустой строке, которая имеет последнем матче (\G
), затем трех символов (...
)до он ((?<= )
)
Java не предоставляет очень полнофункциональные утилиты разделения, поэтому гуава библиотеки do:
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; } }
как дополнение к Барт 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
Поздний Вход.
Ниже приводится краткая реализация с использованием потоков Java8, один лайнер:
String foobarspam = "foobarspam"; AtomicInteger splitCounter = new AtomicInteger(0); Collection<String> splittedStrings = foobarspam .chars() .mapToObj(_char -> String.valueOf((char)_char)) .collect(Collectors.groupingBy(stringChar -> splitCounter.getAndIncrement() / 3 ,Collectors.joining())) .values();
выход:
[foo, bar, spa, m]
это поздний ответ, но я ставлю его там в любом случае для любых новых программистов, чтобы увидеть:
Если вы не хотите использовать регулярные выражения, и не хотите полагаться на стороннюю библиотеку, вы можете использовать этот метод вместо этого, который принимает между 89920 и 100113 наносекунд в 2.80 ГГц (меньше миллисекунды). Это не так красиво, как пример Саймона Никерсона, но это работает:
/** * 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()]); }