リストを循環する方法で反復処理する必要があります。リストに新しい要素を追加し、すべての要素 (olds 要素と news 要素) を反復処理する必要があります。どうすればよいですか? それらのデータ構造はありますか?
質問する
4499 次
4 に答える
19
1 つのオプションは、Stream
クラスを使用して、遅延した循環的な無限シーケンスを作成することです。
scala> val values = List(1, 2, 3)
values: List[Int] = List(1, 2, 3)
scala> Stream.continually(values.toStream).flatten.take(9).toList
res2: List[Int] = List(1, 2, 3, 1, 2, 3, 1, 2, 3)
またはこの方法:
val values = List(1, 2, 3)
def circularStream(values: List[Int],
remaining: List[Int] = List()): Stream[Int] = {
if (remaining.isEmpty)
circularStream(values,values)
else
Stream.cons(remaining.head, circularStream(values, remaining.drop(1)))
}
circularStream(values).take(9).toList //Same result as example #1
于 2010-07-15T14:03:16.583 に答える
10
def forever:Stream[Int] = Stream(1,2,3) append forever
于 2010-07-15T21:34:18.140 に答える
7
この種のものは、実際には標準ストリームライブラリに含まれるに値しますが、そうではないようです。ストリームを使用したdbryneの回答は適切に機能します。または、理解しやすい形式で使用したい場合は、
val listToRepeat:List[Foo]
val forever:Stream[Foo] = for(x<-Stream.continually(1); y<-listToRepeat) yield y
最初のストリームジェネレータは、値を無視している場合でも、物事を永遠に続けます。2番目のジェネレーターは、必要な無限ストリームに暗黙的にフラット化されます。
于 2010-07-15T15:47:21.260 に答える
6
多分これがあなたが望むものだと思います。リストを反復しているときでも、リストに新しい要素を追加する機能。コードは醜いですが、うまくいくようです。
import scala.collection.mutable.Queue
class Circular[A](list: Seq[A]) extends Iterator[A]{
val elements = new Queue[A] ++= list
var pos = 0
def next = {
if (pos == elements.length)
pos = 0
val value = elements(pos)
pos = pos + 1
value
}
def hasNext = !elements.isEmpty
def add(a: A): Unit = { elements += a }
override def toString = elements.toString
}
次のように使用できます。
scala> var circ = new Circular(List(1,2))
res26: Circular[Int] = Queue(1,2)
scala> circ.next
res27: Int = 1
scala> circ.next
res28: Int = 2
scala> circ.next
res29: Int = 1
scala> circ.add(5)
scala> circ.next
res30: Int = 2
scala> circ.next
res31: Int = 5
scala> circ
res32: Circular[Int] = Queue(1,2,5)
于 2010-07-15T22:25:54.010 に答える