Scala перебирает два последовательных элемента списка

Как бы мы перебирали два последовательных элемента списка и применяли функцию различия? Например, у меня есть это:

val list = List(List("Eat", "Drink", "Sleep", "work"), List("Eat", "Sleep", "Dance"))

Я хочу перебрать эти два последовательных элемента и вычислить разницу

Я пробовал это, но не знаю, как перебирать каждые два последовательных элемента

list.map((a,b) => a.diff(b))

вывод должен быть List("Drink", "work")


person Muna Ar    schedule 22.04.2020    source источник
comment
Какой результат вы пытаетесь получить от этих входов?   -  person Seth Tisue    schedule 22.04.2020
comment
я отредактировал вопрос с желаемым результатом   -  person Muna Ar    schedule 22.04.2020
comment
А что, если на входе больше двух списков, что тогда делать? Или список ввода всегда имеет длину два?   -  person Seth Tisue    schedule 22.04.2020
comment
И мне это не похоже на союз? При чем тут функция объединения?   -  person Seth Tisue    schedule 22.04.2020
comment
если список содержит более одного, он должен перебирать все возможные пары. 2 элемента были просто для иллюстрации   -  person Muna Ar    schedule 22.04.2020
comment
Я поправил пост, вместо союза должна быть разница   -  person Muna Ar    schedule 22.04.2020
comment
А как насчет использования вместо этого Наборов?   -  person Luis Miguel Mejía Suárez    schedule 22.04.2020
comment
Почему наборы вместо списков?   -  person Muna Ar    schedule 22.04.2020
comment
@MunaAr, потому что такие операции, как diff, более эффективны для наборов, чем для списков. Наконец, что именно вы хотите сделать? Вы хотите, чтобы все внутренние наборы отличались от всех других внутренних наборов?   -  person Luis Miguel Mejía Suárez    schedule 22.04.2020


Ответы (2)


Если я правильно понимаю, вы, вероятно, захотите перебрать скользящее окно.

list.sliding(2).map{
  case List(a, b) => a.diff(b)
  case List(a) => a
}.toList

В качестве альтернативы вы также можете захотеть grouped(2), который вместо этого разбивает список на группы.

person Jasper-M    schedule 22.04.2020
comment
анализирует ли скользящее окно все возможные комбинации каждого элемента списка? или просто вычисляет разницу для каждых двух последовательных элементов - person Muna Ar; 22.04.2020
comment
@MunaAr, почему бы вам просто не проверить scaladoc? Вместо того, чтобы спрашивать? - person Luis Miguel Mejía Suárez; 22.04.2020
comment
Каждые два последовательных элемента. - person Jasper-M; 22.04.2020

В вашем случае совпадение может работать отлично:

val list = List(List("Eat", "Drink", "Sleep", "work"), List("Eat", "Sleep", "Dance"))
list match { case a :: b :: Nil => a diff b}

Если в списке не всегда есть 2 элемента, вы также должны иметь универсальный регистр в сопоставлении.

person texasbruce    schedule 22.04.2020
comment
это дает некоторое предупреждение, но я получил то, что вы хотели сделать Спасибо - person Muna Ar; 22.04.2020