Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java junit快速检查-生成保持深度有限的随机树_Java_Junit_Quickcheck - Fatal编程技术网

Java junit快速检查-生成保持深度有限的随机树

Java junit快速检查-生成保持深度有限的随机树,java,junit,quickcheck,Java,Junit,Quickcheck,我正在练习junit快速检查 我已经为二叉树的三个排序组件准备了生成器(节点,叶,空) 我希望创建随机树并验证它们的属性 节点的生成器s根据某些概率为其两个分支选择其他生成器 但是,我希望在每次跑步期间的某个时间停止树木生长。作为节点的子树的构建概率必须随着生成的发展而降低 我希望能够通过使用GenerationStatus来控制树的深度,但我看不出具体的方法 另一个假设是在generate()之前调用下一个生成器的configure()方法,但我还没有做到这一点 实现这一切的正确方法是什么?您

我正在练习junit快速检查

我已经为二叉树的三个排序组件准备了生成器(
节点

我希望创建随机树并验证它们的属性

节点的生成器
s根据某些概率为其两个分支选择其他生成器

但是,我希望在每次跑步期间的某个时间停止树木生长。作为
节点的子树的构建概率必须随着生成的发展而降低

我希望能够通过使用
GenerationStatus
来控制树的深度,但我看不出具体的方法

另一个假设是在
generate()
之前调用下一个生成器的
configure()
方法,但我还没有做到这一点

实现这一切的正确方法是什么?

您可以使用它在生成器之间传递值

下面是我编写的一个示例,它生成严格递减的正整数列表:

import com.pholser.junit.quickcheck.generator.GenerationStatus;
import com.pholser.junit.quickcheck.generator.Generator;
import com.pholser.junit.quickcheck.random.SourceOfRandomness;

import java.util.ArrayList;
import java.util.List;

public class ListGenerator extends Generator<List<Integer>> {

    private static final int MAX_VALUE = 100;
    private static final GenerationStatus.Key<Integer> PREVIOUS_KEY = new GenerationStatus.Key<>("previous", Integer.class);

    @SuppressWarnings("unchecked")
    public ListGenerator() {
        super((Class<List<Integer>>) (Class) List.class);
    }

    public List<Integer> generate(SourceOfRandomness sourceOfRandomness, GenerationStatus generationStatus) {
        List<Integer> result = new ArrayList<>();

        int previous = generationStatus.valueOf(PREVIOUS_KEY).orElse(MAX_VALUE);
        int current = sourceOfRandomness.nextInt(previous);

        if (current > 0) {
            result.add(current);

            generationStatus.setValue(PREVIOUS_KEY, current);
            Generator<List<Integer>> listGen = gen().make(ListGenerator.class);
            result.addAll(listGen.generate(sourceOfRandomness, generationStatus));
            generationStatus.setValue(PREVIOUS_KEY, null);
        }

        return result;
    }
}
import com.pholser.junit.quickcheck.generator.GenerationStatus;
导入com.pholser.junit.quickcheck.generator.generator;
导入com.pholser.junit.quickcheck.random.SourceOfRandomness;
导入java.util.ArrayList;
导入java.util.List;
公共类ListGenerator扩展生成器{
专用静态最终整数最大值=100;
私有静态最终生成status.Key PREVIOUS_Key=新生成status.Key(“PREVIOUS”,Integer.class);
@抑制警告(“未选中”)
公共列表生成器(){
超级((类)(类)列表.Class);
}
公共列表生成(随机性源随机性源,生成状态生成状态){
列表结果=新建ArrayList();
int previous=generationStatus.valueOf(previous_KEY).orElse(MAX_VALUE);
int current=sourceOfRandomness.nextInt(上一个);
如果(当前>0){
结果。添加(当前);
generationStatus.setValue(上一个_键,当前);
生成器listGen=gen().make(ListGenerator.class);
addAll(listGen.generate(随机性源,生成状态));
generationStatus.setValue(上一个_键,null);
}
返回结果;
}
}
如何生成一个(有界的)值列表,将其放入树中,并根据这些值组成树。然后你就可以确定这个结构是有界的

您可能需要注意平衡树,以防仅仅按顺序调用
add
可能会产生高度不平衡的树,但这取决于树的实现

同样,对于Helder Pereira,也不需要递归生成器:我将生成一个整数列表并对列表进行排序