Каков наилучший способ разбить список при первом появлении элемента в Scala?

Как лучше всего разбить 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))

Вам нужны два разных типа результатов ((List[Entry], List[Entry]) или List[Entry]), что невозможно в Скала. Вам нужно будет использовать Либо или сказать, что если ни один из элементов не удовлетворяет условию, первый компонент кортежа должен быть пустым, если это то, что вы хотите, ответ Тима должен работать.

Luis Miguel Mejía Suárez 08.04.2019 18:28

@LuisMiguelMejíaSuárez да, извините, я выразился неоднозначно. Сейчас отредактирую.

Luke Neville 08.04.2019 18:30

Это действительно не тот же вопрос, что и тот, который помечен как дубликат, хотя меня не удивит, если этот конкретный вопрос задавали раньше.

Tim 08.04.2019 18:39

@Tim, несколько нелогичное мета-правило: «Если ответ с копией и вставкой работает для нового вопроса, то это дубликат, независимо от того, насколько разные вопросы».. Ответ на связанный дубликат содержит предложение «span [...] возвращает самый длинный префикс списка, все элементы которого удовлетворяют заданному предикату, и остальной части списка».. Эта цитата полностью отвечает на данный вопрос. Вступление длиной в три абзаца о «Записях» и «времени/информации/результатах» представляет собой случайный шум, который ничего не добавляет к вопросу.

Andrey Tyukin 08.04.2019 18:59
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
223
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужно использовать метод span:

list.span(_.result == false)

Это эквивалентно takeWhile/dropWhile, но, возможно, быстрее.

Другие вопросы по теме