Подтвердить что ты не робот

Возврат элемента из списка в Scala

Недавно я работал над начинающим проектом в Scala и задал начальный вопрос о Scala Lists.

Скажем, у меня есть список кортежей (например, List[Tuple2[String, String]]). Есть ли метод удобства, чтобы вернуть первое вхождение указанного кортежа из списка, или нужно ли перебирать его вручную?

4b9b3361

Ответ 1

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))

Ответ 2

Вы можете попробовать использовать find. (Обновлено scala -doc расположение поиска)

Ответ 3

Как уже упоминалось в предыдущем комментарии, find, вероятно, самый простой способ сделать это. В коллекциях Scala существуют три разных метода "линейного поиска", каждый из которых возвращает немного другое значение. Какой из них вы используете, зависит от того, для чего вам нужны данные. Например, вам нужен индекс, или вам просто нужен логический true/false?

Ответ 4

Если вы изучаете scala, я бы неплохо посмотрел на Seq. Это обеспечивает основу для большей функциональности scala.

Ответ 5

Вы также можете сделать это, что не требует знания имен полей в классе Tuple2 - вместо этого используется сопоставление шаблонов:

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

"найти" хорошо, когда вы знаете, что вам нужен только один; если вы хотите найти все подходящие элементы, вы могли бы использовать "фильтр" или эквивалентный сахарин для понимания:

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

Ответ 6

Здесь код, который может вам помочь.

У меня был похожий случай, имеющий набор записей базового класса (здесь A), из которых я хотел найти определенный производный класс node, если он есть (здесь 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))"
}

Важная часть здесь (для моего приложения) заключается в том, что findByName не возвращает Option[A], а Option[B].

Вы можете легко изменить поведение, чтобы вернуть B вместо этого, и выбросить исключение, если оно не было найдено. Надеюсь, это поможет.

Ответ 7

Рассмотрим collectFirst, который поставляет Some[(String,String)] для первого совпадающего кортежа или None иначе, например, следующим образом:

xs collectFirst { case [email protected](a,_) if a == "existing" => t }
Some((existing,str))

scala> xs collectFirst { case [email protected](a,_) if a == "nonExisting" => t }
None

Используя @, мы привязываем значение кортежа к t, чтобы можно было собрать весь соответствующий набор.