【问题标题】:ScalaCheck - Ordered array generatorScalaCheck - 有序数组生成器
【发布时间】:2015-05-17 11:59:27
【问题描述】:

我是第一次尝试 ScalaCheck,我想生成一个有序的 Ints 数组。

我阅读了文档并进行了一些搜索,但没有找到方法。

有人能解释一下吗?

谢谢

【问题讨论】:

    标签: scala scalacheck


    【解决方案1】:

    我假设您想要一个已排序的任意整数数组,对吧?如果是这种情况,您可以使用以下任一方法获取Gen[Array[Int]]

    val genIntArray = Gen.containerOf[Array, Int](
      Gen.chooseNum(Int.MinValue, Int.MaxValue)
    )
    

    或者:

    val genIntArray = implicitly[Arbitrary[Array[Int]]].arbitrary
    

    然后您可以使用map 修改生成器以对其结果进行排序:

     val genSortedIntArray = genIntArray.map(_.sorted)
    

    现在您可以运行genSortedIntArray.sample.get 几次,让自己相信结果是一个随机整数的排序数组。

    如果您想要一个用于整数排序数组的Arbitrary,最好定义一个包装器而不是隐藏默认的Arbitrary[Array[Int]]。例如,您可以编写以下内容:

    case class SortedIntArray(value: Array[Int]) extends AnyVal
    
    object SortedIntArray {
      implicit val arb: Arbitrary[SortedIntArray] = Arbitrary(
        genSortedIntArray.map(SortedIntArray(_))
      )
    }
    

    然后:

    forAll { (a: SortedIntArray) =>
      confirmThatMyFunctionOnSortedIntArraysWorks(a.value)
    }
    

    【讨论】:

    • 当使用像这样的专用生成器时,我认为最好避免一起使用任意生成器。你可以直接使用你的生成器:forAll(genSortedIntArray) { a => ... }。然而,这可能是一个品味问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多