¿Qué debo hacer para poder devolver un iterador de un método/clase? ¿Cómo se podría agregar ese rasgo a una clase?¿Cómo se devuelve un iterador en Scala?
Respuesta
Puede extender Iterator, lo que requerirá que implemente las next
y hasNext
métodos:
class MyAnswer extends Iterator[Int] {
def hasNext = true
def next = 42
}
Pero, obtendrá una mayor flexibilidad si se amplía Iterable, que requiere implementar elements
(o iterator
en 2,8):
class MyAnswer extends Iterable[Int] {
def iterator = new Iterator[Int] {
def hasNext = true
def next = 42
}
}
un idioma común parece ser para exponer un iterador a alguna colección privada, así:
class MyStooges extends Iterable[String] {
private val stooges = List("Moe", "Larry", "Curly")
def iterator = stooges.iterator
}
Para un método, simplemente yield:
def odd(from: Int, to: Int): List[Int] =
for (i <- List.range(from, to) if i % 2 == 1) yield i
Correcto, pero ... el ejemplo del código en realidad no responde la pregunta. ¡Simplemente reemplace ambas instancias de "Lista" con "Iterador" y funciona perfectamente! –
Estas dos respuestas tenían la ayuda de los puestos de abajo y gracias @Dima.
How do I implement an iterator for an existing singly linked list?
why does this iterable implementation produce a stackoverflow?
supongamos que tiene una lista de clase vinculado. Y el requisito es imprimir todos los elementos en la lista.
trait LinkedList {
def nodeValue: Int
def tailList: LinkedList
}
class Node(val nodeValue: Int, val tailList: LinkedList) extends LinkedList
object Nil extends LinkedList {
def nodeValue = throw new IllegalAccessException("head of Nil")
def tailList = throw new IllegalAccessException("tail of Nil")
}
val singleLinkedList = new Node(1,Nil)
val chainedLinkedList = new Node(2,singleLinkedList)
print(chainedLinkedList)
[email protected]: Unit =()
Ahora permite implementar el iterador en esta clase.
trait LinkedList extends Iterator[Int]{
def nodeValue: Int
def tailList: LinkedList
}
class Node(val nodeValue: Int, val tailList: LinkedList) extends LinkedList {
var ptr: LinkedList = this
//The following two are mandatory for extending Iterator
override def hasNext: Boolean = ptr match { case Nil => false; case _=> true}
override def next(): Int = {
val result = ptr.nodeValue
ptr = ptr.tailList
result
}
}
object Nil extends LinkedList {
def nodeValue = throw new IllegalAccessException("head of Nil")
def tailList = throw new IllegalAccessException("tail of Nil")
//The following two are mandatory for extending Iterator
override def hasNext: Boolean = false
override def next(): Int = throw new IllegalAccessException("next of Nil")
}
val singleLinkedList = new Node(1,Nil)
val chainedLinkedList = new Node(2,singleLinkedList)
//Printing this first Time
chainedLinkedList.foreach(println)
//Prints 2 1
//Printing second Time
chainedLinkedList.foreach(println)
//No output
En la implementación del iterador, una vez que ptr llegó al final, no pudo avanzar. La implementación Iterable resuelve esto.
trait LinkedList extends Iterable[Int]{
val nodeValue: Int
val tailList: LinkedList
override def toString(): String = this.mkString(" -> ")
}
class Node(val nodeValue: Int, val tailList: LinkedList) extends LinkedList {
override def iterator: Iterator[Int] = Iterator
.iterate(this: LinkedList)(_.tailList)
.takeWhile(_ != Nil)
.map(_.nodeValue)
}
object Nil extends LinkedList {
lazy val nodeValue= throw new IllegalAccessException("head of Nil")
lazy val tailList = throw new IllegalAccessException("tail of Nil")
override def iterator: Iterator[Int] = Iterator.empty
}
val singleLinkedList = new Node(1,Nil)
val chainedLinkedList = new Node(2,singleLinkedList)
//Printing this first Time
chainedLinkedList.foreach(println)
Output 2 -> 1
chainedLinkedList.foreach(println)
Output 2 -> 1
- 1. Scala convertir un iterador [Opción [T]] en un iterador [T]
- 2. Scala, extendiendo el iterador
- 3. Conversión de un iterador de Scala en un vector
- 4. ¿readlines() devuelve una lista o un iterador en Python 3?
- 5. ¿Cómo se define un método en Scala que devuelve un tipo?
- 6. Scala iterador con el mapa y para
- 7. ¿Cómo usar un iterador?
- 8. Cómo clonar un iterador?
- 9. Cómo restringir un iterador a ser un iterador directo?
- 10. ¿Cómo se define un tipo de interfaz de iterador?
- 11. ¿Cómo se define un pedido en Scala?
- 12. ¿Cómo se define un tipo para una función en Scala?
- 13. ¿Cómo incrementar un iterador en 2?
- 14. ¿Clonar un iterador en Java?
- 15. Scala: sobrescribir un método Java genérico que se devuelve un valor nulo
- 16. mapa Scala el iterador no produce efectos secundarios
- 17. scala conversión implícita o explícita de iterador a iterable
- 18. El mapa Scala Array devuelve ArraySeq
- 19. ¿Efectos secundarios en un iterador considerados perjudiciales?
- 20. Scala - iterador sobre todas las líneas de los ficheros en un directorio
- 21. Creando un iterador compuesto en F #
- 22. Cuándo escribir un iterador?
- 23. En C++, ¿cómo obtengo un índice int de un iterador?
- 24. ¿Hay un iterador modificable en Java?
- 25. ¿Cómo saber la diferencia entre un iterador y un iterable?
- 26. ¿Se puede combinar un rango en Scala?
- 27. ¿Cómo se reifica en Scala un restablecimiento con dos turnos?
- 28. ¿Cómo se define un rasgo de paquete * privado * en Scala?
- 29. ¿Cómo se implementa un Hadoop Mapper en Scala 2.9.0?
- 30. ¿Cómo se prueba un ActionResult que devuelve un ContentResult?
No hay forma de enviar mensajes privados, pero me gustaría plantear una pregunta: ¿podría indicarme un uso del idioma común que menciona? Si no, ¿para qué podría ser útil? ¿Por qué no solo devuelve la lista? ¿No sería este idioma menos eficiente? (También: he visto ese "truco" Iterable [A] varias veces y parece ser una de las formas más rápidas de crear algo parecido a una colección, ¿hay alguna "alternativa" a este enfoque? Lo hago porque Iterator da poca información para que los métodos no puedan optimizarse bien, ¿y si supiera que mi pseudo coll regresa ordenado o tiene acceso aleatorio rápido? – Aktau