저는 최근에 스칼라에서 초보자 프로젝트를 작업했으며 스칼라의리스트에 대해 초급 질문을했습니다.스칼라의 목록에서 요소 반환하기
내가 튜플 (예 : List[Tuple2[String, String]]
)의 목록을 가지고 있다고 가정 해 봅시다. 목록에서 지정된 튜플의 첫 번째 발생을 반환하는 편리한 방법이 있습니까? 아니면 손으로 목록을 반복해야합니까?
저는 최근에 스칼라에서 초보자 프로젝트를 작업했으며 스칼라의리스트에 대해 초급 질문을했습니다.스칼라의 목록에서 요소 반환하기
내가 튜플 (예 : List[Tuple2[String, String]]
)의 목록을 가지고 있다고 가정 해 봅시다. 목록에서 지정된 튜플의 첫 번째 발생을 반환하는 편리한 방법이 있습니까? 아니면 손으로 목록을 반복해야합니까?
find을 사용해보세요. (찾기의 scala-doc 위치 업데이트)
스칼라를 배우면 Seq 특성을 잘 살펴볼 것입니다. 그것은 스칼라의 많은 기능적 장점을위한 기초를 제공합니다.
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))
앞의 설명에서 언급했듯이 find
이 아마도 가장 쉬운 방법 일 것입니다. 스칼라의 콜렉션에는 세 가지 다른 "선형 검색"메쏘드가 있습니다. 각 메쏘드는 약간 다른 값을 반환합니다. 어느 것이 당신이 데이터를 필요로하는지에 달려 있습니다. 예를 들어 색인이 필요하거나 부울이 필요합니까? true
/false
? 당신이 하나를 필요로 알고
list find { case (x,y,_) => x == "C" && y == "D" }
는 "발견"
이 좋다 - 은 당신은 또한 Tuple2 클래스에 필드 이름을 아는 필요로하지 않는이, 할 수"선형 검색"방법에 대한 자세한 정보를 제공해 주시겠습니까? 내가 튜플의 인덱스를 얻으려고하고있다. (튜플의 일부만 가지고있다.) – krookedking
실제로 내가 찾고있는 것을 찾았다.'.zipWithIndex.collect {case ("partOfTuple", _, i) => i }' – krookedking
은 패턴 대신 일치 사용 ; 당신은 당신이 이해를 위해 "필터"또는 해당하는 설탕을 사용할 수 있습니다 중 하나 일치하는 모든 요소를 찾으려면 :
for ((x,y,z) <- list if x == "C" && y == "D") yield (x,y,z)
두 번째 예제는'filter'와 같이 동작하는 것처럼 보입니다. 즉, 질문 작성자가 원하는 첫 번째 속성이 아닌 속성과 일치하는 모든 * 요소를 반환합니다. –
을 여기에 도움이 될 수 코드입니다.
필자가 유사한 파생 클래스 클래스의 노드 (있는 경우) (여기서는 B
)를 찾고자하는 기본 클래스 항목 (여기서는 A
)의 콜렉션을 가지고 비슷한 경우가 있습니다.
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
을 대신 반환하고 예외가 발견되지 않으면 예외를 throw 할 수 있습니다. 희망이 도움이됩니다. 완전히 일치하는 튜플을 수집 할 수 있도록
우리 t
상기 튜플의 값을 결합 @
을 사용하여 다음과 같은 예를 들어, 그렇지 않으면 제 일치하는 튜플 또는 None
위한 Some[(String,String)]
전달 collectFirst
,
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
고려 .
링크가 끊어졌습니다. – ctford
링크가 작동합니다. – akauppi