Работает на 2.7.7:
def stepSum (суммы: List [Int], шаги: List [Int]): List [Int] = шаги соответствуют {case Nil = & gt; sums.reverse.tail case x :: xs = & gt; stepSum (sums.head + x :: sums, steps.tail)} days res10: Список [Int] = Список (31, 28, 31, 30, 31) stepSum (Список (0), дней) res11: Список [Int ] = Список (31, 59, 90, 120, 151)
split(delimiter)
по умолчанию удаляет завершающие пустые строки из массива результатов. Чтобы отключить этот механизм, нам нужно использовать перегруженную версию split(delimiter, limit)
с limit
, установленную на отрицательное значение, например
String[] split = data.split("\\|", -1);
. Немного больше деталей: split(regex)
внутренне возвращает результат split(regex, 0)
и в документации этого метода вы можете найти (выделение мое)
Параметр
limit
контролирует количество применений шаблона и, следовательно, влияет на длину результирующего массив.Если предел
n
равен больше нуля , тогда шаблон будет применен не более n - 1 раз, длина массива будет не больше n, а массив последняя запись будет содержать все входные данные за пределами последнего сопоставленного разделителя.Если
n
не является положительным, шаблон будет применяться как можно больше раз, и массив может иметь любую длину.Если
n
равно нулю, шаблон будет применяться столько раз, сколько возможно, массив может иметь любую длину, а конечные пустые строки будут отброшены.Исключение:
Стоит отметить, что удаление пустой пустой строки имеет смысл только в том случае, если такая пустая строка создана с помощью механизма split . Поэтому для
"".split(anything)
, так как мы не можем расколоть""
, мы получим массив результатов[""]
. Это происходит потому, что split не произошло здесь, поэтому""
, несмотря на то, что он пуст, а trailing представляет оригинальную строку, а не пустую строку, которая была создана процессом разбиения.
Другой вариант - использовать Splitter Guava. У него нет накладных расходов на регулярное выражение (которое вам не нужно в этом случае) и по умолчанию не отбрасывает пустые строки.
Например:
String data = "5|6|7||8|9||";
Iterable<String> results = Splitter.on('|').split(data);
// convert to array
String[] asArray = Iterables.toArray(results, String.class);
Для получения дополнительной информации см. wiki: https://github.com/google/guava/wiki/StringsExplained
Разделяет эту строку вокруг совпадений данного регулярного выражения. Этот метод работает как бы путем вызова метода разделения с двумя аргументами с заданным выражением и предельным аргументом нуля. Поэтому конечные пустые строки не включаются в результирующий массив.
Перегруженный String.split (regex, int) более подходит для вашего случая.
Из документации String.split(String regex)
:
Этот метод работает, как если бы, вызывая метод разделения с двумя аргументами с заданным выражением и предельный аргумент нуль. Поэтому конечные пустые строки не включаются в результирующий массив.
Таким образом, вам придется использовать две версии аргументов
String.split(String regex, int limit)
с отрицательным значением:String[] split = data.split("\\|",-1);
Doc:
Если предел n больше нуля, шаблон будет применяться не более n - 1 раз, длина массива будет не больше n, а последняя запись массива будет содержать все входные данные за пределами последний сопоставленный разделитель. Если n не является положительным, шаблон будет применяться столько раз, сколько возможно, и массив может иметь любую длину. Если n равно нулю, шаблон будет применяться столько раз, сколько возможно, массив может иметь любую длину, а конечные пустые строки будут отброшены.
Это не оставит никаких пустых элементов , включая конечные.
String[] split = data.split("\\|",-1);
Это не фактическое требование за все время. Недостаток выше показан ниже:
Scenerio 1:
When all data are present:
String data = "5|6|7||8|9|10|";
String[] split = data.split("\\|");
String[] splt = data.split("\\|",-1);
System.out.println(split.length); //output: 7
System.out.println(splt.length); //output: 8
Когда отсутствуют данные:
Scenerio 2: Data Missing
String data = "5|6|7||8|||";
String[] split = data.split("\\|");
String[] splt = data.split("\\|",-1);
System.out.println(split.length); //output: 5
System.out.println(splt.length); //output: 8
Реальное требование - длина должна быть 7, хотя отсутствуют данные. Потому что есть случаи, когда мне нужно вставить в базу данных или что-то еще. Мы можем достичь этого, используя подход ниже.
String data = "5|6|7||8|||";
String[] split = data.split("\\|");
String[] splt = data.replaceAll("\\|$","").split("\\|",-1);
System.out.println(split.length); //output: 5
System.out.println(splt.length); //output:7
Что я здесь сделал, я удаляю «|» трубы в конце, а затем разделение строки. Если у вас есть «,» в качестве разделителя, вам нужно добавить «, $» внутрь replaceAll.
data.split("\\|", 8)
– Subhrajyoti Majumder 30 January 2013 в 12:48split("\\|", 8)
, потому что это ограничивает первые восемь токенов! Если ваша строка является переменной, вы должны использоватьsplit("\\|", -1)
, чтобы она создавала неограниченное количество токенов, а t отбрасывать пустые токены в конце. – ADTC 19 September 2013 в 05:59split(regex)
. Они оказались здесь и выяснили, что это не так. – Attila Tanyi 11 July 2017 в 14:25