Выполните итерации по списку, возвратив ток, затем и элемент перед током

У меня есть проблемы с записью определенного приложения в scala-esque и изящном пути. Я попробовал это в течение некоторого времени теперь, но я не могу найти "хорошее" решение этой проблемы:

Учитывая, что у меня есть следующий Список:

List("foo", "bar", "baz", "blah")

Я хочу Выполнить итерации по этому списку, не только давая мне элемент тока для каждого Повторения, но также и элемента прежде и после элемента тока. Это могло бы быть Tuple3, но не требуется, чтобы. Это могло быть подписью Кортежа:

(Option[T], T, Option[T])

Для разъяснения, что я имею в виду это - предложенный Кортеж для каждого повторения по a List[String], окончание после четвертого.

Повторение 1: (None, "foo", Some("bar"))

Повторение 2: (Some("foo"), "bar", Some("baz"))

Повторение 3: (Some("bar"), "baz", Some("blah"))

Повторение 4: (Some("baz"), "blah", None)

Как я мог достигнуть такого результата? Снова: Я не связываюсь с Tuple3, любое другое решение также очень ценится!

Спасибо!

11
задан Malax 25 January 2010 в 19:52
поделиться

3 ответа

Вот один подход. Он использует новый метод сбора SCALA 2.8 .

def window[A](l: List[A]): Iterator[List[Option[A]]] = 
   (None :: l.map(Some(_)) ::: List(None)) sliding 3

window(List(1, 2, 3, 4, 5)).toList

// List(List(None, Some(1), Some(2)), List(Some(1), Some(2), Some(3)), List(Some(2), Some(3), Some(4)), List(Some(3), Some(4), Some(5)), List(Some(4), Some(5), None))

Обновление : вот версия, которая работает для потоков.

def windowS[A](s: Stream[A]): Stream[List[Option[A]]] = 
  (None #:: s.map(Some(_): Option[A]) #::: Stream(None: Option[A])).sliding(3).toStream.map(_.toList)  

val posInts = Stream.range(1, Integer.MAX_VALUE)
windowS(posInts).take(5).toList
16
ответ дан 3 December 2019 в 05:34
поделиться

REPRONROMIM Ответ работает хорошо, если вы используете 2.8. Если вы используете 2.7.x, нет большого стокового решения, но вы можете создать свой собственный. Например, если вы хотите только тройки, где до и после существующих, вы можете сделать что-то вроде этого:

class Tuple3Iterator[T](solo: Iterator[T]) extends Iterator[(T,T,T)] {
  var current = if (solo.hasNext) Some(solo.next) else None
  var future = if (solo.hasNext) Some(solo.next) else None
  def hasNext = solo.hasNext
  def next = {
    val past = current
    current = future
    future = Some(solo.next)
    (past.get,current.get,future.get)
  }
}
class IteratorToT3[T](it: Iterator[T]) {
  def treble = new Tuple3Iterator[T](it)
}
implicit def allowTrebling[T](it: Iterable[T]) = new IteratorToT3[T](it.elements)

scala> List("Hi","there",5,"you").treble.foreach(println(_))         
(Hi,there,5)
(there,5,you)

Если вы предпочитаете разрешить до и после того, чтобы остаться параметрами, (редактировать: я действительно не дал полный или ошибку Свободный набор изменений раньше) Тогда вместо этого используйте

class Tuple3Iterator[T](solo: Iterator[T]) extends Iterator[(Option[T],T,Option[T])] {
  var current = None:Option[T]
  var future = if (solo.hasNext) Some(solo.next) else None
  def hasNext = (solo.hasNext || future!=None)
  def next = {
    val past = current
    current = future
    future = if (solo.hasNext) Some(solo.next) else None
    (past,current.get,future)
  }
}

scala> List("Hi","there",5,"you").treble.foreach(println(_))
(None,Hi,Some(there))
(Some(Hi),there,Some(5))
(Some(there),5,Some(you))
(Some(5),you,None)
3
ответ дан 3 December 2019 в 05:34
поделиться

XCHG AX, AX и NOP . Это нормально, XCHG AX, AX - NO-OP. Почему одна не должна тратить лишние кодировки оперативных кодов с инструкциями, которые ничего не делают?

сомнительны Почему Вы видите обе Mnemonics Peart. Я думаю, это просто недостаток в вашей разборке, нет двоичных различий.

-121--1381800-

Лучше использовать SCALA 2.8 и REP REPRONYS раствор , конечно, но вот мое решение для Scala 2.7:

class MyIterator[T](l: List[T]) extends Iterator[(Option[T],T,Option[T])] {
  var last: Option[T] = None
  var curr = l
  def hasNext = !curr.isEmpty
  def next = {
    val t = curr match {
      case first :: second :: tail => (last, first, Some(second))
      case first :: Nil => (last, first, None)
      case Nil => throw new java.util.NoSuchElementException
    }
    last = Some(curr.head)
    curr = curr.tail
    t
  }
}
2
ответ дан 3 December 2019 в 05:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: