我会尽我所能来解释这种情况。Groovy,在当前节点之后插入节点
我有以下DB列:
oid - task - start - end - realstart - realend
我的要求是有类似以下的输出:
oid1 - task1 - start1 - end1
oid2 - task2 - start2 - end2
其中TASK1是task
,TASK2是task + "real"
,启动1是start
,START2是realstart
,end1是end
,end2是realend
BUT
在第一行应始终被创建(那些start/end
字段是从未空)的第二行只应创建如果realstart
和realend
存在可能不是正确的。
输入是6门阵列(每列一个),输出必须是4个阵列,这样的事情:
#input oid,task,start,end,realstart,realend
#output oid,task,start,end
我想使用类似oid.each
,但我不知道如何添加节点在当前之后。订单在要求中很重要。
对于任何解释请问,谢谢!
GiLA3
回答
,你不希望(或不能)改变输入/输出数据格式,您的评论和理解后,这里的另一个解决方案,它可以满足您所要求的使用类对数据进行分组并使其更易于管理:
import groovy.transform.Canonical
@Canonical
class Input {
String[] oids = [ 'oid1', 'oid2' ]
String[] tasks = [ 'task1', 'task2' ]
Integer[] starts = [ 10, 30 ]
Integer[] ends = [ 20, 42 ]
Integer[] realstarts = [ 12, null ]
Integer[] realends = [ 21, null ]
List<Object[]> getEntries() {
// ensure all entries have the same size
def entries = [ oids, tasks, starts, ends, realstarts, realends ]
assert entries.collect { it.size() }.unique().size() == 1,
'The input arrays do not all have the same size'
return entries
}
int getSize() {
oids.size() // any field would do, they have the same length
}
}
@Canonical
class Output {
List oids = [ ]
List tasks = [ ]
List starts = [ ]
List ends = [ ]
void add(oid, task, start, end, realstart, realend) {
oids << oid; tasks << task; starts << start; ends << end
if (realstart != null && realend != null) {
oids << oid; tasks << task + 'real'; starts << realstart; ends << realend
}
}
}
def input = new Input()
def entries = input.entries
def output = new Output()
for (int i = 0; i < input.size; i++) {
def entry = entries.collect { it[ i ] }
output.add(*entry)
}
println output
安排数据的责任在Input
课上,知道如何组织输出数据的责任在Output
课上。
运行这段代码打印:
Output([oid1, oid1, oid2], [task1, task1real, task2], [10, 12, 30], [20, 21, 42])
你可以从output
对象的数组(列表,实际上,却叫toArray()
如果在列表获取数组)与output.oids
,output.tasks
,output.starts
和output.ends
。
的@Canonical
注释只是使类实现equals,hashCode时的toString等等...
如果你不明白的地方,请在评论中。