2017-04-14 10 views
0

私は状況を説明するために最善を尽くします。Groovy、現在のノードの後ろにノードを挿入

私は、次のデシベルの列があります。

oid - task - start - end - realstart - realend 

私の要件は、次のような出力を持つことです。

タスク1が taskある
oid1 - task1 - start1 - end1 
oid2 - task2 - start2 - end2 

、タスク2がtask + "real"で、START1がstartあり、START2 realstart、end1はend、end2はrealend

BUT

最初の行は常に作成されるべきである(それらstart/endフィールドが空になることはありません)realstartrealendが真ではないかもしれないが存在する場合に、第2行にのみ作成されるべきです。

入力6つのアレイ(各列に1つずつ)あり、出力は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]) 

あなたは(実際にはリスト、が、配列を取得するリスト上の場合toArray()を呼び出す)の配列を取得しoutput.oidsoutput.tasksoutput.startsoutput.endsoutputオブジェクトからできます。このコードの印刷を実行

@Canonical注釈はちょうどあなたが何かを理解していない場合は、コメントでお願いし...そうで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

関連する問題