scala - 如何生成从集合中挑选的 n 个唯一元素的列表?

标签 scala testing unique scalacheck

如何使用 ScalaCheck 从一组值(不是生成器)生成一个包含 n 个唯一 值的列表 (Gen[List[T]])? This post使用 Gen[T]* 而不是一组值,我似乎无法重写它以使其工作。

编辑

应@Jubobs 的要求,我现在可耻地展示了我到目前为止所做的尝试,揭示了我在使用 ScalaCheck 时的完全新手状态:-)

我只是尝试将 gs: Gen[T] 重复参数替换为 Set 在@Eric 写的解决方案中 here :

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(_)) 有红色下划线,IntelliJ IDEA 告诉我 “你应该在盲目(虽然直观)试用之前先阅读 ScalaCheck API和错误”,或者 “类型不匹配,预期:Traversable[Gen[T]],实际 List[T]”,我不记得了。

我还尝试了其他几种方法,事后看来,我发现其中大部分方法很荒谬(因此不值得发布),最天真的方法是按原样使用@Eric 的(否则有用且整洁)解决方案:

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)

经过一些测试后,我发现 pleaseNoDuplicatesPlease 实际上包含重复项,此时我权衡了是否必须通读 ScalaCheck API 并比现在了解更多(这将不可避免地,然后逐渐来),或者在 StackOverflow 上发布我的问题(在仔细搜索是否存在类似问题之后)。

最佳答案

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]] = org.scalacheck.Gen$$anon$3@78693eee

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))

关于scala - 如何生成从集合中挑选的 n 个唯一元素的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43825538/

相关文章:

linux - 如何强制 bjam 构建但不运行 boost 回归测试套件?

python - 分组并计算唯一值的数量( Pandas )

javascript - 选择对象数组中的唯一项目

Scala风格: constant map vs pattern matching

ruby-on-rails - 为库模块添加 rspec 测试似乎没有获得期望和匹配器

scala - 无法编译 2.2 到 2.3 迁移

eclipse - Fitnesse eclipse项目根路径

java - 将一个组组合成多个组而不重复

scala - SBT:如何在build.sbt中引用其他项目源码?

syntax - ScalaTest 语法如何工作?