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

2024-02-07

如何生成n个列表unique值(Gen[List[T]])使用 ScalaCheck 从一组值(不是生成器)中获取?这个帖子 https://stackoverflow.com/questions/5107281/generating-permutations-with-scalacheck uses Gen[T]*而不是一组值,我似乎无法重写它以使其工作。

EDIT

应@Jubobs 的要求,我现在可耻地展示我迄今为止所尝试的内容,揭示了我在使用 ScalaCheck 方面的完全新手状态:-)

我只是尝试更换gs: Gen[T]重复参数aSet@Eric 写的解决方案here https://stackoverflow.com/questions/5107281/generating-permutations-with-scalacheck:

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
}

but is.toList.map(perm(_))带有红色下划线,IntelliJ IDEA 告诉我“在盲目(尽管直观)尝试和错误之前,您应该首先阅读 ScalaCheck API”, 或者可能“类型不匹配,预期:Traversable[Gen[T]],实际列表[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 https://github.com/rickynils/scalacheck/blob/99c0123ef8f53b2920c325555633a36a48c0f1e7/src/main/scala/org/scalacheck/Gen.scala#L669就在你的巷子里:

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))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何生成从集合中选取的 n 个唯一元素的列表? 的相关文章

随机推荐