我对 Spock 不是很熟悉,所以我将不胜感激提供一些提示。我有一个自定义对象列表。我想检查此列表是否包含任意数量的对象,其中某些字段具有精确值。
例如,我有包含 100 条记录的 pojo 和列表
public class CustomObject {
private int id;
private String name;
private double salary;
}
Run Code Online (Sandbox Code Playgroud)
我想检查这样的事情:
List<CustomObject> objects = new ArrayList<>();
assert objects.contains(
object.id==100 && object.salary > 900
)
Run Code Online (Sandbox Code Playgroud)
但“名称”可以是任何。
我的任务类在执行之前依赖于其他任务。我想对可以并行的任务进行分组并对它们进行排序。我决定首先可以将其表示为 DAG 并尝试使用 JGrapht。首先,我遍历任务的输入列表以获取所有任务及其依赖项并将它们收集在一个列表中。然后,对于每个任务,我在图中创建一个顶点。
DirectedAcyclicGraph<Task, DefaultEdge> d = new DirectedAcyclicGraph<>(DefaultEdge.class);
Set<Task> all = collectAllTasks(tasks);
all.forEach(d::addVertex);
Run Code Online (Sandbox Code Playgroud)
然后使用相同的列表我尝试在节点之间创建边缘。
all.forEach(task -> {
Set<TaskName> predecessors = task.getPredecessors();
predecessors.forEach(name -> {
Task predecessor = taskService.getTaskByName(name);
d.addEdge(predecessor, task);
});
});
Run Code Online (Sandbox Code Playgroud)
然后我尝试对任务进行分组
private Set<Set<TaskId>> groupTasks(DirectedAcyclicGraph<TaskId, DefaultEdge> dag) {
Set<Set<TaskId>> groups = new LinkedHashSet<>();
Iterator<TaskId> iterator = new TopologicalOrderIterator<>(dag);
iterator.forEachRemaining(taskId -> {
//source?
if (dag.incomingEdgesOf(taskId).isEmpty()) {
if (groups.isEmpty()) {
Set<TaskId> set = new HashSet<>();
set.add(taskId);
groups.add(set);
} else {
groups.iterator().next().add(taskId);
}
}
Set<TaskId> tasks = new HashSet<>(Graphs.successorListOf(dag, taskId)); …Run Code Online (Sandbox Code Playgroud)