2014-01-09 2 views
4

List에서 임의의 요소를 여러 개 반환하려면 어떻게해야합니까?List 스칼라에서 임의의 여러 요소를 반환하는 방법

이 질문에 How to choose a random element from an array in Scala?는 사용을 의미한다 : 나에 가변

import scala.util.Random 
val A = Array("please", "help", "me") 
Random.shuffle(A.toList).head 

내가 루프를 만들고 (이미 선택된 하나 제외) 다음 임의 요소를 선택 유지하고 새로운에 그것을 추가 할 수 있습니다 생각 명부. 스칼라에서 이것을 달성하기위한 더 관용적/기능적인 방법이 있습니까?

+3

'Random.shuffle (A.toList) .take (N)' – senia

+0

는 "받아"이 루프를 사용하여 구현합니다. 아마도 성능상의 이유로 설명 할 수 있습니다. –

+1

@HappyCoder : 예,'Random.shuffle (A.toIndexedSeq) .take (n)'이 더 좋습니다. – senia

답변

12

head 메서드는 목록의 첫 번째 요소를 반환하지만 take(n)은 목록 앞에있는 n 개의 요소를 반환합니다. 당신이 목록을 셔플 난 후에, 단지 take을 사용

def takeRandomN[A](n: Int, as: List[A]) = 
    scala.util.Random.shuffle(as).take(n) 

을 목록 as보다 짧은 다음 n이 단순히 as 셔플 것입니다 경우.

+0

작은 목록에는 괜찮 으면 좋겠지 만 작은 임의의 하위 집합을 원한다는 큰 목록은 힘들 수 있습니다. – FearTheCron

1

mutables/vars를 사용하지 않고보다 보수적 인 변형입니다. 그냥 운동을 위해 :

def takeRandomFrom[T](n: Int, list: List[T]): List[T] = { 
    @tailrec 
    def innerTake(n:Int, list: List[T], result: List[T]): List[T] = { 
    if (n == 0 || list.isEmpty) { 
    result 
} else { 
    innerTake(n - 1, list.tail, list.head :: result) 
} 
    } 

    innerTake(n, Random.shuffle(list), Nil) 
} 

takeRandomFrom(2, Array("please", "help", "me").toList) 
관련 문제