Разбиение строки на каждый n-й символ - PullRequest
66 голосов
/ 19 февраля 2010

В JavaScript мы можем разделить строку на каждый 3-й символ

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

Я пытаюсь понять, как это сделать на Java. Есть указатели?

Ответы [ 7 ]

115 голосов
/ 19 февраля 2010

Вы можете сделать это так:

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

, который производит:

[123, 456, 789, 0]

Регулярное выражение (?<=\G...) соответствует пустой строке с последним соответствием (\G), за которым следуют три символа (...) перед это ((?<= ))

80 голосов
/ 19 февраля 2010

Java не предоставляет полнофункциональных утилит расщепления, поэтому библиотеки Guava do:

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

Проверьте Javadoc для Splitter ; это очень мощно.

45 голосов
/ 19 февраля 2010
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;
    }
}
4 голосов
/ 02 ноября 2016

В дополнение к Bart Kiers answer Я хочу добавить, что вместо трех точек ... в выражении регулярного выражения можно использовать три точки, которые представляют три символа, которые можно записать .{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

3 голосов
/ 15 июля 2018

Поздний вход.

Ниже приведена краткая реализация с использованием потоков 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]
1 голос
/ 02 февраля 2018

Это поздний ответ, но я в любом случае выкладываю его для новых программистов:

Если вы не хотите использовать регулярные выражения, и не желаютполагаться на стороннюю библиотеку, вы можете использовать этот метод вместо этого, который занимает от 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()]);
    }
0 голосов
/ 05 марта 2019

Вы также можете разбить строку на каждый n-й символ и поместить их каждый в каждый индекс списка:

Здесь я составил список строк с именем Sequence:

List Sequence

Затем я делю строку "KILOSO" на каждые 2 слова.Таким образом, «KI», «LO», «SO» будут включены в отдельный индекс Списка, называемый «Последовательность».

Строка S = KILOSO

Sequence = Arrays.asList (S.split ("(? <= \ G ..)"));</p>

Итак, когда я делаю:

System.out.print (Sequence)

Это должно вывести:

[KI, LO, SO]

, чтобы проверить, что я могу написать:

System.out.print (Sequence.get (1))

будет напечатано:

LO

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...