2013-07-21 2 views
1

컬렉션의 요소 색인을 찾는 우아한 방법은 무엇입니까? 지금은 다음과 같은 메소드를 구현했습니다 :Iterable에 대한 요소 색인 얻기

def getIndexForValue[T] (value: T, collection: Iterable[T]): Option[Int] = { 
    val pair = collection.zipWithIndex.find(_._1 == value) 
    if (pair.isDefined) Some(pair.get._2) else None 
    } 

더 세련된 방식으로 다시 작성할 수 있습니까? 감사합니다

답변

3

수집 서열의 하위 유형이 아닌 경우 지수가 더 의미가 없다고 그냥

collection.indexOf(value) 

참고. 당신이 정말로 어떤 수집 index을 얻고 싶은 경우에

, 당신은

collection.toSeq.indexOf(value) 

이 후 또는 일부 개시 인덱스에서이 목록에있는 일부 값이 처음 나타나는 인덱스를 찾습니다 사용할 수 있습니다. elem 검색 할 요소 값입니다. 에서 시작 인덱스 은 elem에 동일하게 (==에 의해 결정된 것처럼)이리스트의 첫 번째 요소의 인덱스> = from을 반환하고, 존재하지 않으면 -1을 반환합니다.

+1

'Iterable'형질에는이 방법이 없습니다. – MyTitle

+5

컬렉션이 집합 인 경우 색인의 의미는 무엇입니까? Seq 만 정의 된 요소 순서를가집니다. – Eastsun

+1

@Eastsun, 그건 사실이 아닙니다. TreeSet에는 정의 된 반복 순서가 있으며 Set이지만 Seq는 아닙니다. Iterable에 대한 몇 가지 메소드가 주문한 콜렉션에만 적용됩니다. Paul Phillips와 Martin Odersky는 디자인에 결함이 있다는 데 의견을 같이했습니다. https://groups.google.com/d/msg/scala-debate/je4vZbR3WbA/_fa5aNyTyuoJ –