tutorial - scala y java




Devolver un elemento de una lista en Scala (5)

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 ?


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.


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.





list