2017-04-14 125 views
0

我会尽我所能来解释这种情况。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字段是从未空)的第二行只应创建如果realstartrealend存在可能不是正确的。

输入是6门阵列(每列一个),输出必须是4个阵列,这样的事情:

#input oid,task,start,end,realstart,realend 
#output oid,task,start,end 

我想使用类似oid.each,但我不知道如何添加节点在当前之后。订单在要求中很重要。

对于任何解释请问,谢谢!

回答

1

,你不希望(或不能)改变输入/输出数据格式,您的评论和理解后,这里的另一个解决方案,它可以满足您所要求的使用类对数据进行分组并使其更易于管理:

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.oidsoutput.tasksoutput.startsoutput.ends

@Canonical注释只是使类实现equals,hashCode时的toString等等...

如果你不明白的地方,请在评论中。

1

如果您需要一个“数组”,其大小从一开始就不知道,则应该使用List来代替。但在Groovy中,这非常易于使用。

下面是一个例子:

final int OID = 0 
final int TASK = 1 
final int START = 2 
final int END = 3 
final int R_START = 4 
final int R_END = 5 

List<Object[]> input = [ 
     //oid,  task, start, end, realstart, realend 
     [ 'oid1', 'task1', 10, 20, 12, 21 ], 
     [ 'oid2', 'task2', 30, 42, null, null ] 
] 

List<List> output = [ ] 

input.each { row -> 
    output << [ row[ OID ], row[ TASK ], row[ START ], row[ END ] ] 
    if (row[ R_START ] && row[ R_END ]) { 
     output << [ row[ OID ], row[ TASK ] + 'real', row[ R_START ], row[ R_END ] ] 
    } 
} 

println output 

,输出:

[[oid1, task1, 10, 20], [oid1, task1real, 12, 21], [oid2, task2, 30, 42]] 
+0

感谢您的有用解决方案,但在我的情况下,列表中的每个属性都是一个数组,所有长度都相同,所以我总共有6个数组,它的工作原理是否相同? – GiLA3

+0

为什么你会以这种奇怪的格式获取数据?无论如何,我会编辑答案以尝试提供帮助。 – Renato