Разделить строку равномерно на массив с помощью n - Java [duplicate]

Как вы отфильтровываете «свободу», кроме как с такими критериями, как «наследие», «ulic» и т. д.

   df_Fixed[~df_Fixed["Busler Group"].map(lambda x: x.startswith('Liberty'))]
61
задан Vijay Dev 19 February 2010 в 16:24
поделиться

6 ответов

Вы можете сделать это следующим образом:

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

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

[123, 456, 789, 0]

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

103
ответ дан Bart Kiers 21 August 2018 в 19:30
поделиться
  • 1
    :) Я бы, вероятно, пошел и на решение Саймона: моим коллегам, возможно, не понравится, если я начну добавлять свой код с регулярным выражением к базе кода. – Bart Kiers 19 February 2010 в 16:43
  • 2
    Мне бы не хотелось думать, что кто-то проголосовал за этот ответ просто потому, что им не нравятся регулярные выражения. – William Brendel 19 February 2010 в 16:49
  • 3
    сумасшедший реквизит для верховного реггеза mojo, но, как читатель этого кода, я охотился бы за вами и яйца вашего дома. :) – Kevin Bourrillion 19 February 2010 в 18:54
  • 4
    Пока вы вызываете это через правильно названную функцию (т.е. splitIntoParts) и не вставляете непосредственно эту строку в свой код, все в порядке. В противном случае пусть начинается охота :) – GreenieMeanie 19 February 2010 в 18:55
  • 5
    Часть того, что делает этот трюк настолько пугающим, что он не будет работать на всех языках. Например, JavaScript не поддерживает \G, и Python не будет разделяться на регулярное выражение, которое соответствует нулевым символам. Но тогда, если у Java был «получить все соответствия», метод, как и любой другой язык, вам не пришлось бы придумывать этот трюк, в первую очередь, @Bart. ;) – Alan Moore 20 February 2010 в 01:24
1
ответ дан Cardinal System 21 August 2018 в 19:30
поделиться

В качестве дополнения к ответа 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

3
ответ дан Community 21 August 2018 в 19:30
поделиться

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

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

Проверьте Javadoc for Splitter ; это очень мощный.

77
ответ дан Pang 21 August 2018 в 19:30
поделиться
  • 1
    +1 Это правильный ответ (также известный как: знать и использовать библиотеки ) – Jonik 24 February 2010 в 20:57
  • 2
    Я бы взял этот ответ над регулярным выражением ... только потому, что он более удобен в обслуживании (например, тот факт, что меньше людей знают о RegEx, чем ppl, способный читать «читаемый» код). – sivabudh 2 March 2010 в 01:50
  • 3
    только хорошо, если у вас уже есть зависимость от Guava. В противном случае вам нужно добавить другую зависимость - то, что вам не следует делать, не проверяя сначала сотрудников или системного архитектора. – foo 22 July 2017 в 18:29
1
ответ дан Pankaj Singhal 21 August 2018 в 19:30
поделиться
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;
    }
}
43
ответ дан Simon Nickerson 21 August 2018 в 19:30
поделиться
  • 1
    +1 для выбора простейшего способа решения проблемы. – Vijay Dev 19 February 2010 в 16:50
  • 2
    Если вы держите коллекцию подстрок, которые покрывают всю исходную строку, новый метод String будет фактически тратить (n-1) * sizeof (int). Новые массивы char Strings будут иметь одинаковую память, но каждая из них будет иметь отдельное поле длины. Тем не менее, если какие-либо подстроки будут позже отброшены, новая строка может уменьшить память. Я бы не стал беспокоиться в любом случае, если исходная строка очень большая. – ILMTitan 19 February 2010 в 21:58
  • 3
    – wchargin 5 June 2013 в 00:08
  • 4
    @WChargin: Хм, ты прав, я понятия не имею, почему я написал этот комментарий. Я удалю его. Благодарю. – Denis Tulskiy 5 June 2013 в 03:54
Другие вопросы по тегам:

Похожие вопросы: