【问题标题】:How can I generate a list of n unique elements picked from a set?如何生成从集合中挑选的 n 个唯一元素的列表?
【发布时间】:2017-05-06 21:26:09
【问题描述】:

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

编辑

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

我只是尝试在@Eric 写的解决方案here 中将gs: Gen[T] 重复参数替换为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]],实际 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 上发布我的问题(仔细搜索是否存在类似问题后)。

【问题讨论】:

  • [...] 我似乎无法重写它以使其工作。编辑您的问题并展示您的尝试。

标签: scala testing unique scalacheck


【解决方案1】:

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-23
  • 2023-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多