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. Ftp transferir el rsync-way
- 4. WPF One Way Enlace roto
- 5. Eliminar entradas redundantes, scala 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. Homoscedascity test para Two-Way ANOVA
- 10. scala-way para gestionar conjuntos de objetos
- 11. Circular UIScrollView
- 12. Referencia circular con mangosta
- 13. dependencia circular en C++
- 14. Resolving circular depenency
- 15. Python meta-circular evaluator
- 16. Solución de Dependencia Circular
- 17. Dependencia circular en Python
- 18. Coincidencia circular. PHP/MySql
- 19. Pythonic Lista circular
- 20. Dibujar sector circular
- 21. barra de progreso circular
- 22. Buffer circular en Flash
- 23. Circular C++ Header Incluye
- 24. WPF Circular Border
- 25. android circular gallery?
- 26. MVC - dependencia circular
- 27. Lectura de múltiples entradas desde la misma línea Scala Way
- 28. ¿Qué es Rails Way? (legibilidad frente a secado)
- 29. comprensión y solución de K-Way se fusionan tipo
- 30. ¿Cómo hacer la inyección de la dependencia python-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} ' –