scalacheck生成一个不同的值列表

cl25kdpy  于 2021-07-14  发布在  Java
关注(0)|答案(1)|浏览(265)

我对scalacheck还比较陌生,不知何故我想生成一个不同值的列表(即一个集合)。在我的方法中,价值观并不是唯一的。

val valueList: Gen[List[Int]] = Gen.ListOf(Arbitrary.arbitrary[Int])

创建具有唯一值/集合的列表的可能方法有哪些?也许是使用 suchThat 或者 distinct ?

uinbv5nw

uinbv5nw1#

粗糙但有效:

Gen.listOf(Arbitrary.arbitrary[Int]).map(_.toSet)

如果你想要一套特定尺寸的衣服,你可以这样做

def setOfN[A](n: Int, gen: Gen[A]): Gen[Set[A]] =
  Gen.listOfN(n, gen).flatMap { lst =>
    val set = lst.toSet

    if (set.size == n) Gen.const(set)
    else if (set.size > n) Gen.const(set.take(n))
    else setOfN(n - set.size, gen.retryUntil(x => !set(x))).flatMap(_ ++ set)
  }

(值得注意的是,retryuntil可能很脆弱,特别是当n相对于通常生成的值的数量增长时(例如 Int scalacheck相当频繁地生成0、+/-1等)
当然,既然 org.scalacheck.util.Buildable 例如 Set ```
Gen.containerOfSet, Int

相关问题