tutorial recorrer programacion lista introduccion funcional codigos codigo aplicaciones scala list

recorrer - scala introduccion



Devolver un elemento de una lista en Scala (7)

Recientemente he estado trabajando en un proyecto para principiantes en Scala y tengo una pregunta para principiantes sobre las listas de Scala.

Supongamos que tengo una lista de tuplas ( List[Tuple2[String, String]] , por ejemplo). ¿Hay algún método de conveniencia para devolver la primera ocurrencia de una tupla especificada de la Lista, o es necesario recorrer la lista a mano?


scala> val list = List(("A", "B", 1), ("C", "D", 1), ("E", "F", 1), ("C", "D", 2), ("G", "H", 1)) list: List[(java.lang.String, java.lang.String, Int)] = List((A,B,1), (C,D,1), (E,F,1), (C,D,2), (G,H,1)) scala> list find {e => e._1 == "C" && e._2 == "D"} res0: Option[(java.lang.String, java.lang.String, Int)] = Some((C,D,1))


Como se mencionó en un comentario anterior, find es probablemente la forma más fácil de hacer esto. En realidad, hay tres métodos diferentes de "búsqueda lineal" en las colecciones de Scala, cada uno con un valor ligeramente diferente. Cuál de las aplicaciones depende de para qué necesita los datos. Por ejemplo, ¿necesita un índice, o simplemente necesita un booleano true / false ?


También puede hacer esto, que no requiere conocer los nombres de los campos en la clase Tuple2; en su lugar, usa la coincidencia de patrones:

list find { case (x,y,_) => x == "C" && y == "D" }

"encontrar" es bueno cuando sabes que solo necesitas uno; si quieres encontrar todos los elementos que combinan, puedes usar "filtro" o el equivalente azucarado para la comprensión:

for ( (x,y,z) <- list if x == "C" && y == "D") yield (x,y,z)


Si estás aprendiendo scala, echaré un buen vistazo al rasgo de Seq . Proporciona la base para gran parte de la bondad funcional de Scala.


Aquí hay un código que puede ayudarte.

Tuve un caso similar, con una colección de entradas de la clase base (aquí, A ) de la cual quería encontrar un determinado nodo de la clase derivada, si hay alguno (aquí, B ).

class A case class B(val name: String) extends A object TestX extends App { val states: List[A] = List( B("aa"), new A, B("ccc") ) def findByName( name: String ): Option[B] = { states.find{ case x: B if x.name == name => return Some(x) case _ => false } None } println( findByName("ccc") ) // "Some(B(ccc))" }

La parte importante aquí (para mi aplicación) es que findByName no devuelve la Option[A] sino la Option[B] .

Puede modificar fácilmente el comportamiento para devolver B lugar, y lanzar una excepción si no se encontró ninguno. Espero que esto ayude.


Podría intentar usar find . (Actualización de la ubicación de scala-doc de find)


Considere collectFirst que entrega Some[(String,String)] para la primera tupla coincidente o None , de lo contrario, por ejemplo de la siguiente manera:

xs collectFirst { case t@(a,_) if a == "existing" => t } Some((existing,str)) scala> xs collectFirst { case t@(a,_) if a == "nonExisting" => t } None

Usando @ , vinculamos el valor de la tupla a t para que pueda recopilarse una tupla completa coincidente.