Упакуйте последовательные дубликаты элементов списка в подсписки в Scala - PullRequest
0 голосов
/ 15 января 2019

Я видел вопрос, похожий на мой в базе данных, но он нигде не связан с моими сомнениями в коде. Я прошёл код ниже и застрял, потому что не понимаю res.last.head!=h? Я искал документацию по Scala, но не могу найти то, что _.last.head.

  def _pack(res: List[List[A]], rem: List[A]):List[List[A]] = rem match {
    case Nil => res
    case h::tail if (res.isEmpty || res.last.head != h) => _pack(res:::List(List(h)), tail)
    case h::tail => _pack(res.init:::List(res.last:::List(h)), tail)
  }
  _pack(List(),l)
}
println(pack(List(1,1,2,3,3)))

1 Ответ

0 голосов
/ 15 января 2019

Я не уверен, что тебя там беспокоит.Вы можете найти оба в List[A] ScalaDoc .

List[A] - это коллекция, которая внутренне хранится как единый связанный список с каждым узлом (Cons), имеющим headтипа A и tail типа List[A].

List[A].last просто возвращает последний элемент в списке, как следует из названия (примечание: это очень неэффективно, так как требует прохождения через всесписок с самого начала).Теперь, поскольку res имеет тип List[List[A]], res.last имеет тип List[A].List[A].head - первый элемент в списке.

Подводя итог res.last.head - это первый элемент из последних List, хранящихся в списке списков res.


почему есть два оператора case с h::tail.

Вам необходимо больше узнать о Сопоставлении с образцом в Scala и особенно о "стражах".Код в этом match / case может быть переписан как:

if (rem == Nil)
    res // first case
else {
  val h = rem.head
  val tail = rem.tail
  if (res.isEmpty || res.last.head != h)
     _pack(res:::List(List(h)), tail) // second case
  else
     _pack(res.init:::List(res.last:::List(h)), tail) // last case
}

Другими словами, код сначала проверяет, является ли rem уже пустым, и завершается, если он равен true.Если rem не пусто, мы берем его head (h) и теперь у нас есть выбор: соответствует ли это h предыдущему элементу в списке или нет.Этот if защищает первый случай, последний случай без if работает как ветвь else.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...