Вывод Iterable.sliding в виде кортежа - PullRequest
10 голосов
/ 17 января 2011

Метод slide для коллекций возвращает скользящее окно заданного размера в виде X[Iterable[A]], где X - тип коллекции, а A - тип элемента. Часто мне нужны два или три элемента, и я предпочитаю называть их. Один уродливый обходной путь для sliding(2) следующий:

points.sliding(2).foreach{ twoPoints =>
      val (p1,p2) = (twoPoints.head,twoPoints.last)
      //do something
}

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

(a,b) = (twoPoints(0),twoPoints(1))

не работает.

Ответы [ 3 ]

17 голосов
/ 18 января 2011

Я многое сделал в этом ответе только на прошлой неделе.

points.sliding(2).foreach { case X(p1, p2) => ... }

Если points является Array, то заменить X на Array. Если это List, замените X на List и т. Д.

Обратите внимание, что вы выполняете сопоставление с шаблоном, поэтому вам нужно {} вместо () для параметра.

4 голосов
/ 18 января 2011

twoPoints представляется списком.Попробуйте это:

points.sliding(3).foreach{ _ match {
  case Seq(a, b, c) => {
      //do something
  }
}

Вы будете удивлены тем, какие виды сопоставления с образцом кунг-фо позволяют вам избежать неприятностей.

1 голос
/ 30 октября 2017

Недавно я хотел добавить немного сахара в скользящие итераторы, поэтому придумал следующее:

implicit class SlidingOps[A](s: Seq[A]) {
  def slidingPairs = (s, s.tail).zipped
  def slidingTriples = (s, s.tail, s.tail.tail).zipped
}

Это работает с любым Seq, но, вероятно, наиболее эффективно с List..zipped возвращает объект scala.runtime.Tuple2Zipped (или Tuple3Zipped для 3-элементного кортежа), который определяет несколько знакомых методов высшего порядка, так что их аргументы принимают несколько аргументов,так что вы можете написать:

points.slidingPairs.foreach { (a, b) => ... }

или даже:

(1 to 10).slidingTriples.map(_ + _ + _)

Вы можете оптимизировать реализацию, если хотите, чтобы она была действительно эффективной для типов, не включенных в список.

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