首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >排序数组的jqwik对及其某些元素

排序数组的jqwik对及其某些元素
EN

Stack Overflow用户
提问于 2020-02-03 01:16:50
回答 1查看 249关注 0票数 1

下面的代码旨在生成随机排序的数组,并将key作为该数组的一个元素。但是我不知道问题所在,密钥不是在数组中吗?

代码语言:javascript
复制
@Provide
Arbitrary<Map<Integer, Integer[]>> llstPairs() {


  // sortedArrayGenerator is generattor that return Arbitrary<Integer[]> sorted values
  // and it works fine
  Arbitrary<Integer[]> vals = sortedArrayGenerator();

  Integer[] sample = vals.sample();

  Arbitrary<Integer> key = Arbitraries.samples(sample);


  return Arbitraries.maps(key,vals);

}

为什么我的键不在数组中,我需要键是Integer[]数组的一个元素。

EN

回答 1

Stack Overflow用户

发布于 2020-02-03 17:28:02

你应该意识到的一件重要的事情是:“永远不要创建你自己的样本,让jqwik决定什么时候去做。”换句话说:Arbitrary.sample()只用于测试生成器,例如在JShell中,或者使用jqwik属性之外的生成器。

相反,您需要的是Arbitrary.flatMap()。每当需要一个生成器的结果为另一个生成器提供数据时,就需要平面映射。所以你的第一次尝试可能是:

代码语言:javascript
复制
@Provide
Arbitrary<Map<Integer, Integer[]>> llstPairs() {
    Arbitrary<Integer[]> vals = sortedArrayGenerator().filter(array -> array.length > 0);

    return vals.flatMap(array -> {
        Arbitrary<Integer> keys = Arbitraries.of(array);
        return Arbitraries.maps(keys, vals);
    });

}

两个旁注:

但是,这并不容易,因为为map生成的数组与您用于键的数组不同。您必须确保在创建映射时使用完全相同的数组。所以你可以这样说:

代码语言:javascript
复制
@Provide
Arbitrary<Map<Integer, Integer[]>> llstPairs() {
    Arbitrary<Integer[]> vals = sortedArrayGenerator().filter(array -> array.length > 0);

    return vals.flatMap(array -> {
        Arbitrary<Integer> keys = Arbitraries.of(array);
        Arbitrary<List<Integer>> listOfKeys = keys.list();
        return listOfKeys.map(lok -> {
            Map<Integer, Integer[]> map = new HashMap<>();
            for (Integer k : lok) {
                map.put(k, array);
            }
            return map;
        });
    });
}

这是相当复杂的,因为-据我所知-你并不真的需要映射,但想要一个键数组对的列表。这就是为什么我会这样做:

代码语言:javascript
复制
@Provide
Arbitrary<List<Tuple.Tuple2<Integer, Integer[]>>> listOfPairs() {
    Arbitrary<Integer[]> vals = sortedArrayGenerator().filter(array -> array.length > 0);
    return vals.flatMap(arrayOfInt -> {
        Arbitrary<Integer> key = Arbitraries.of(arrayOfInt);
        return key.map(k -> Tuple.of(k, arrayOfInt)).list();
    });
}

这里有一个属性来检查它是否做了它应该做的事情:

代码语言:javascript
复制
@Property(tries = 100)
void listOfPairs_keyIsInArray(@ForAll("listOfPairs") List<Tuple.Tuple2<Integer, Integer[]>> listOfPairs) {
    for (Tuple.Tuple2<Integer, Integer[]> pair : listOfPairs) {
        Integer key = pair.get1();
        Integer[] array = pair.get2();
        Assertions.assertThat(array).contains(key);
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60028612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档