У меня есть проблемы с записью определенного приложения в 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, любое другое решение также очень ценится!
Спасибо!
Вот один подход. Он использует новый метод сбора 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
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)
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
}
}