Necesito repetir a través de una lista pero de forma circular. También necesito agregar nuevos elementos a la lista e iterar sobre todos los elementos (antiguos y elementos de noticias), ¿Cómo lo hago? ¿Hay alguna estructura de datos para ellos?Iterating circular way
Respuesta
Creo que esto es lo que quieres; la capacidad de agregar nuevos elementos a su lista incluso mientras la itera. El código es feo pero parece funcionar.
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
}
Se puede utilizar la siguiente manera:
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)
Una opción es utilizar la clase Stream
para crear un perezoso, circular, secuencia infinita:
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)
o de esta manera:
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
Este tipo de cosas realmente merece estar en la norma biblioteca de la secuencia, pero no parece ser. La respuesta de dbryne con una corriente funciona bien, o si lo prefiere en la comprensión de la forma-
val listToRepeat:List[Foo]
val forever:Stream[Foo] = for(x<-Stream.continually(1); y<-listToRepeat) yield y
El primer generador de corriente hace que las cosas van por siempre a pesar de que está haciendo caso omiso del valor. El segundo generador se aplana implícitamente en la secuencia infinita que desee.
No necesita un argumento para' Stream.continually() ', creo que usar' Stream [Unit] 'parece un poco menos confuso que' Stream [Int] '. – Debilski
def forever:Stream[Int] = Stream(1,2,3) append forever
Tenga en cuenta que esto es infinito, pero no circular. –
- 1. Iterating Backbone Collection
- 2. The Rails Way - Namespaces
- 3. Eliminar entradas redundantes, scala way
- 4. WPF One Way Enlace roto
- 5. Ftp transferir el rsync-way
- 6. C++ header circular incluye
- 7. Iterating over std :: map en PHP con SWIG
- 8. Iterating C++ vector desde el final hasta el comienzo
- 9. scala-way para gestionar conjuntos de objetos
- 10. Homoscedascity test para Two-Way ANOVA
- 11. Circular UIScrollView
- 12. WPF Circular Border
- 13. Python meta-circular evaluator
- 14. Buffer circular en Flash
- 15. Coincidencia circular. PHP/MySql
- 16. Dependencia circular en Python
- 17. Dibujar sector circular
- 18. Referencia circular con mangosta
- 19. Solución de Dependencia Circular
- 20. barra de progreso circular
- 21. dependencia circular en C++
- 22. Resolving circular depenency
- 23. MVC - dependencia circular
- 24. android circular gallery?
- 25. Circular C++ Header Incluye
- 26. Pythonic Lista circular
- 27. ¿Cómo hacer la inyección de la dependencia python-way?
- 28. comprensión y solución de K-Way se fusionan tipo
- 29. ¿Qué es Rails Way? (legibilidad frente a secado)
- 30. Lectura de múltiples entradas desde la misma línea Scala Way
sus fuentes son infinitos, pero no son circulares. Para hacerlos circulares necesitas un truco como 'def circular [T] (xs: Stream [T]): Stream [T] = {lazy val knot: Stream [T] = xs # ::: knot; nudo} ' –