Как лучше всего разбить List
при первом появлении элемента, удовлетворяющего определенному условию? Если ни один элемент в списке не удовлетворяет условию, должен быть возвращен исходный список.
У меня есть класс, определенный следующим образом:
class Entry(val time: Long, val info: String, val result: Boolean)
Затем у меня есть список этих объектов ввода: List[Entry]
.
Каков наилучший способ разбить список при первом появлении элемента, имеющего result=true
? Итак, допустим, у вас есть список:
List(e1, e2, e3, e4, e5, e6, e7)
где e4
и e6
имеют result=true
, тогда возвращаемый результат должен быть двумя списками следующим образом:
(List(e1,e2,e3), List(e4,e5,e6,e7))
. Или, если ни один из элементов не имеет result=true
, то должен быть возвращен список (List(e1, e2, e3, e4, e5, e6, e7), List())
.
Я уже пробовал использовать .indexOf
и .splitAt
, но это не сработало:
val list = List(e1, e2, e3, e4, e5, e6, e7)
val (beforeSuccess, afterSuccess) = list.splitAt(list.indexOf(_.result == true))
@LuisMiguelMejíaSuárez да, извините, я выразился неоднозначно. Сейчас отредактирую.
Это действительно не тот же вопрос, что и тот, который помечен как дубликат, хотя меня не удивит, если этот конкретный вопрос задавали раньше.
@Tim, несколько нелогичное мета-правило: «Если ответ с копией и вставкой работает для нового вопроса, то это дубликат, независимо от того, насколько разные вопросы».. Ответ на связанный дубликат содержит предложение «span
[...] возвращает самый длинный префикс списка, все элементы которого удовлетворяют заданному предикату, и остальной части списка».. Эта цитата полностью отвечает на данный вопрос. Вступление длиной в три абзаца о «Записях» и «времени/информации/результатах» представляет собой случайный шум, который ничего не добавляет к вопросу.
Вам нужно использовать метод span
:
list.span(_.result == false)
Это эквивалентно takeWhile/dropWhile
, но, возможно, быстрее.
Вам нужны два разных типа результатов (
(List[Entry], List[Entry])
илиList[Entry]
), что невозможно в Скала. Вам нужно будет использовать Либо или сказать, что если ни один из элементов не удовлетворяет условию, первый компонент кортежа должен быть пустым, если это то, что вы хотите, ответ Тима должен работать.