2017-05-06 10 views
3

ScalaCheckを使用して値のセット(ジェネレータ以外)からn ユニークのリストを生成する方法は? This postは値のセットの代わりにGen[T]*を使用しており、動作させるために書き換えることはできません。私は今、恥私は単にgs: Gen[T]繰り返しパラメータを交換しようとしたセットから選んだn個のユニークな要素のリストを生成するにはどうすればよいですか?

:-) ScalaCheckを使用しての私の全くの初心者の状況を明らかにし、私がこれまで試してみました内容を表示@Jubobsの要求で

EDIT

def permute[T](n: Int, gs: Set[T]): Gen[Seq[T]] = { 
    val perm = Random.shuffle(gs.toList) 
    for { 
     is <- Gen.pick(n, 1 until gs.size) 
     xs <- Gen.sequence[List[T], T](is.toList.map(perm(_))) 
    } yield xs 
} 

しかしis.toList.map(perm(_))赤、ウィットに下線ました:@Ericが解決hereとして書いたものでSetへh IntelliJ IDEA 「ブラインド(直感的ではありますが)試行錯誤の前に、ScalaCheck APIを最初に読んでください」、またはおそらく「タイプが一致しません、予想:トラバーサブル[Gen [T]]、実際のリスト[T]」私は覚えていない。

@ Eric(そうでなければ有用で素敵な)のままのソリューションをそのまま使用しているのは、あまりにも馬鹿げている(したがって、投稿する価値がない)いくつかの方法を試しました。

これは必然的になり、徐々に来る私はScalaCheck APIを介して読み、今私がやるよりも、より全体の多くを理解することの私のオプションを計量し、その時点で、私は実際に pleaseNoDuplicatesPleaseは重複が含まれていることを見ていくつかのテストの後
val g = for (i1 <- Gen.choose(0, myList1.length - 1); 
    i2 <- Gen.choose(0, myList2.length - 1)) 
    yield new MyObject(myList1(i1), myList2(i2)) 
val pleaseNoDuplicatesPlease = permute(4, g, g, g, g, g) 

、( )、または質問をStackOverflowに投稿する(似たような質問があるかどうかを注意深く検索した後)。

+1

* [...]私はそれが*動作させるために、それを書き換えるように見えることはできません。あなたの質問を編集し、あなたが試したことを示してください。 – Jubobs

答えて

4

Gen.pickは、右のあなたの路地次第です:

scala> import org.scalacheck.Gen 
import org.scalacheck.Gen 

scala> val set = Set(1,2,3,4,5,6) 
set: scala.collection.immutable.Set[Int] = Set(5, 1, 6, 2, 3, 4) 

scala> val myGen = Gen.pick(5, set).map { _.toList } 
myGen: org.scalacheck.Gen[scala.collection.immutable.List[Int]] = [email protected] 

scala> myGen.sample 
res0: Option[scala.collection.immutable.List[Int]] = Some(List(5, 6, 2, 3, 4)) 

scala> myGen.sample 
res1: Option[scala.collection.immutable.List[Int] = Some(List(1, 6, 2, 3, 4)) 
+1

さらにいくつかのオプションがあります:https://github.com/rickynils/scalacheck/blob/master/src/main/scala/org/scalacheck/Gen.scala#L651-L699 'oneOf'は1を選択し、 'someOf'は0-nを選択し、atLeastOneは1-nを選択し、' pick'は指定した数を選択します。 – Charles

+1

ありがとうJubobs、それは 'Gen.pick'です:-) – bugfoot

関連する問題