加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读