Dividere una stringa per ogni carattere n-esimo

In JavaScript è così che possiamo dividere una stringa ad ogni carattere di 3 °

"foobarspam".match(/.{1,3}/g) 

Sto cercando di capire come farlo in Java. Qualche indicazione?

Potresti farlo in questo modo:

 String s = "1234567890"; System.out.println(java.util.Arrays.toString(s.split("(?< =\\G...)"))); 

che produce:

 [123, 456, 789, 0] 

La regex (?< =\G...) corrisponde a una stringa vuota che ha l' ultima corrispondenza ( \G ) seguita da tre caratteri ( ... ) prima di essa ( (?< = ) )

Java non fornisce utility di divisione molto complete, quindi le librerie Guava eseguono:

 Iterable pieces = Splitter.fixedLength(3).split(string); 

Dai un’occhiata a Javadoc for Splitter ; è molto potente.

 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 getParts(String string, int partitionSize) { List parts = new ArrayList(); int len = string.length(); for (int i=0; i 

Come aggiunta alla risposta di Bart Kiers, voglio aggiungere che è ansible invece di usare i tre punti ... nell’espressione regex che rappresentano tre caratteri che puoi scrivere .{3} che ha lo stesso significato.

Quindi il codice sarà simile al seguente:

 String bitstream = "00101010001001010100101010100101010101001010100001010101010010101"; System.out.println(java.util.Arrays.toString(bitstream.split("(?< =\\G.{3})"))); 

Con questo sarebbe più facile modificare la lunghezza della stringa e la creazione di una funzione è ora ragionevole con una lunghezza di stringa di input variabile. Questo potrebbe essere fatto come il seguente:

 public static String[] splitAfterNChars(String input, int splitLen){ return input.split(String.format("(?< =\\G.{%1$d})", splitLen)); } 

Un esempio in IdeOne: http://ideone.com/rNlTj5

Ingresso tardivo.

Di seguito è riportata una implementazione succinta utilizzando gli stream Java8, uno solo:

 String foobarspam = "foobarspam"; AtomicInteger splitCounter = new AtomicInteger(0); Collection splittedStrings = foobarspam .chars() .mapToObj(_char -> String.valueOf((char)_char)) .collect(Collectors.groupingBy(stringChar -> splitCounter.getAndIncrement() / 3 ,Collectors.joining())) .values(); 

Produzione:

 [foo, bar, spa, m] 

Questa è una risposta tardiva, ma la sto mettendo comunque là fuori perché i nuovi programmatori possano vedere:

Se non si desidera utilizzare espressioni regolari e non si desidera fare affidamento su una libreria di terze parti, è ansible utilizzare invece questo metodo, che impiega tra 89920 e 100113 nanosecondi in una CPU a 2,80 GHz (meno di un millisecondo). Non è bello come l’esempio di Simon Nickerson, ma funziona:

  /** * 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 * 0, the last substring will start at the sum of * lengths and end at the end of string. * @param lengths * the lengths of each substring in order. If any substring is not * provided a length, it will use defaultLength. * @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 parts = new java.util.ArrayList(); 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()]); }