scala – 如何生成从集合中挑选的n个唯一元素的列表?
发布时间:2020-12-16 18:13:19 所属栏目:安全 来源:网络整理
导读:如何使用 ScalaCheck从一组值(而不是生成器)生成n个唯一值(Gen [List [T]])的列表? This post使用Gen [T] *而不是一组值,我似乎无法重写它以使其工作. 编辑 在@Jubobs的要求下,我现在可耻地展示我到目前为止所尝试的内容,揭示了我使用ScalaCheck的新手状态:
如何使用
ScalaCheck从一组值(而不是生成器)生成n个唯一值(Gen [List [T]])的列表?
This post使用Gen [T] *而不是一组值,我似乎无法重写它以使其工作.
编辑 在@Jubobs的要求下,我现在可耻地展示我到目前为止所尝试的内容,揭示了我使用ScalaCheck的新手状态:-) 我只是尝试将gs:Gen [T]重复参数替换为@Eric写为解决方案here中的Set: 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]],实际列表[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) 经过一些测试后,我看到pleaseNoDuplicates实际上包含重复项,此时我权衡了我必须阅读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,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,4)) scala> myGen.sample res1: Option[scala.collection.immutable.List[Int] = Some(List(1,4)) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |