2008-09-10 6 views
16

저는 최근에 스칼라에서 초보자 프로젝트를 작업했으며 스칼라의리스트에 대해 초급 질문을했습니다.스칼라의 목록에서 요소 반환하기

내가 튜플 (예 : List[Tuple2[String, String]])의 목록을 가지고 있다고 가정 해 봅시다. 목록에서 지정된 튜플의 첫 번째 발생을 반환하는 편리한 방법이 있습니까? 아니면 손으로 목록을 반복해야합니까?

답변

6

find을 사용해보세요. (찾기의 scala-doc 위치 업데이트)

2

스칼라를 배우면 Seq 특성을 잘 살펴볼 것입니다. 그것은 스칼라의 많은 기능적 장점을위한 기초를 제공합니다.

+0

링크가 끊어졌습니다. – ctford

+0

링크가 작동합니다. – akauppi

13
 
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

Some ((C, D, 1))이 아닌 (C, D, 1)을 반환 할 수 있습니까? 나는 list (1)을 사용하면 같은 방법을 의미한다. – grass

+2

@grass 트리플 ('C, D, 1)'이 목록에없는 경우 반환 값은 무엇입니까? –

+1

없음 또는 예외 또는 빈 세트. 트리플이 발견되지 않으면 반환 값을 사용자 정의 할 수있는 방법이 있다면 (내 자신의 find() 메소드를 작성하는 것만 제외하면) 좋을 것입니다. – grass

3

앞의 설명에서 언급했듯이 find이 아마도 가장 쉬운 방법 일 것입니다. 스칼라의 콜렉션에는 세 가지 다른 "선형 검색"메쏘드가 있습니다. 각 메쏘드는 약간 다른 값을 반환합니다. 어느 것이 당신이 데이터를 필요로하는지에 달려 있습니다. 예를 들어 색인이 필요하거나 부울이 필요합니까? true/false? 당신이 하나를 필요로 알고

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

는 "발견"

이 좋다 -

은 당신은 또한 Tuple2 클래스에 필드 이름을 아는 필요로하지 않는이, 할 수
+0

"선형 검색"방법에 대한 자세한 정보를 제공해 주시겠습니까? 내가 튜플의 인덱스를 얻으려고하고있다. (튜플의 일부만 가지고있다.) – krookedking

+0

실제로 내가 찾고있는 것을 찾았다.'.zipWithIndex.collect {case ("partOfTuple", _, i) => i }' – krookedking

1

은 패턴 대신 일치 사용 ; 당신은 당신이 이해를 위해 "필터"또는 해당하는 설탕을 사용할 수 있습니다 중 하나 일치하는 모든 요소를 ​​찾으려면 :

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

두 번째 예제는'filter'와 같이 동작하는 것처럼 보입니다. 즉, 질문 작성자가 원하는 첫 번째 속성이 아닌 속성과 일치하는 모든 * 요소를 반환합니다. –

1

을 여기에 도움이 될 수 코드입니다.

필자가 유사한 파생 클래스 클래스의 노드 (있는 경우) (여기서는 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))" 
} 

여기서 중요한 부분은 (내 애플 리케이션을위한) findByNameOption[A]하지만 Option[B]을 반환하지 않습니다.

대신 동작을 수정하여 B을 대신 반환하고 예외가 발견되지 않으면 예외를 throw 할 수 있습니다. 희망이 도움이됩니다. 완전히 일치하는 튜플을 수집 할 수 있도록

1

우리 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 

고려 .