Я не мог себе представить, что не существует более простого способа сделать это ... и есть так много способов решить это на самом деле, но у всех есть один или другой "недостаток" (например, вам нужно добавить некоторыеИндекс перед или в конце ... или вам нужно позаботиться о том, чтобы вы не потеряли последнюю запись, так как нет окончательного ""
и т. д.).Если вам не нужен список списков, это может быть просто:
myarrayList.joinToString("") {
if (it == "") "\n" else it
}
, который в основном просто возвращает String
следующим образом:
+23-25+125+455
*230-293/6
+293
+21
и, возможно, это дает вам подсказку, что еще может быть возможно с joinToString
... теперь все еще с использованием joinToString
, но просто разделив его соответствующим образом (явноОбходной путь):
myarrayList.joinToString("|") {
if (it == "") "FORM_END" else it
}.splitToSequence("|FORM_END|") // use split if List<*> is ok for you
.map {
it.splitToSequence("|") // use split if *<List<String>> is ok for you
}
Теперь это в основном даст вам последовательность последовательностей.Добавление .map { it.toList() }.forEach(::println)
даст следующий результат:
[+23, -25, +125, +455]
[*230, -293, /6]
[+293]
[+21]
Другой подход, без обходного пути joinToString
, а скорее использование mapIndexedNotNull
с zipWithNext
, который печатает так же, как и раньше:
myarrayList.mapIndexedNotNull { i, s -> i.takeIf { s == "" } }
.let {
listOf(-1) + it + myarrayList.size // ugly, but we need beginning and end too, not only the delimiting indices
}
.asSequence()
.zipWithNext { from, upto -> myarrayList.subList(from + 1, upto) }
.forEach(::println)
Вы также можете построить что-то с fold
на месте ... но тогда просто убедитесь, чтотакже собрать последнюю запись в списке; -)