Collections 处理嵌套列表以生成图形数据

Collections 处理嵌套列表以生成图形数据,collections,groovy,Collections,Groovy,嗨,我有一个这样的列表结构 udbList=[ [132, 2011-11-28 00:00:00.0, Save Object], [141, 2011-11-29 00:00:00.0, Save Object], [133, 2011-11-29 00:00:00.0, Read Object], [182, 2011-12-01 00:00:00.0, Save Object], [119

嗨,我有一个这样的列表结构

udbList=[
      [132, 2011-11-28 00:00:00.0, Save Object], 
          [141, 2011-11-29 00:00:00.0, Save Object], 
          [133, 2011-11-29 00:00:00.0, Read Object], 
          [182, 2011-12-01 00:00:00.0, Save Object], 
          [119, 2011-12-02 00:00:00.0, Read Object], 
          [11, 2011-12-03 00:00:00.0, Write Object], 
          [12, 2011-12-04 00:00:00.0, Save Object]
          ]
dataXML+="<dataset seriesname='"<event type>"' color='""' lineThickness='2'>"
 udbList.each{
  dataXML += "<set value='"+it[0]+"'/>" //for that event type populate all count values (1st field in the list)
}
def dataXML = "<graph caption='s' lineThickness='3' rotateNames='1'>" + "
       <categories>
         //Logic to iterate through udbList and insert all dates
        <category name='2011-11-28'/>
        <category name='2011-11-29'/>
        <category name='2011-12-01'/>  
        <category name='2011-12-02'/>
        <category name='2011-12-03'/>
        <category name='2011-12-04'/> 
     </categories>   
    <dataset seriesname='Save Object' color='""' lineThickness='2'>" +
    <set value='132'/>
    <set value='141'/>
    <set value='182'/>
    <set value='0'/>    // 0 because no value for event Save Object on 2011-12-02
    <set value='0'/>    // 0 because no value for event Save Object on 2011-12-03
    <set value='12'/>
    </series>
    <dataset seriesname='Read Object' color='""' lineThickness='2'>"
    <set value='0'/> 
    <set value='133'/>
    <set value='0'/> 
    <set value='119'/>
    <set value='0'/> 
    <set value='0'/> 
    </series>
    <dataset seriesname='Write Object' color='""' lineThickness='2'>"
    <set value='0'/> 
    <set value='0'/> 
    <set value='0'/> 
    <set value='0'/> 
    <set value='11'/>
    <set value='0'/> 
    </series>
</graph>
我正在创建一个dataXML,用它生成图形。 图的类型是按日期的多行图,其中每行代表事件(列表的最后一个值-保存/读取/写入)

像这样的

udbList=[
      [132, 2011-11-28 00:00:00.0, Save Object], 
          [141, 2011-11-29 00:00:00.0, Save Object], 
          [133, 2011-11-29 00:00:00.0, Read Object], 
          [182, 2011-12-01 00:00:00.0, Save Object], 
          [119, 2011-12-02 00:00:00.0, Read Object], 
          [11, 2011-12-03 00:00:00.0, Write Object], 
          [12, 2011-12-04 00:00:00.0, Save Object]
          ]
dataXML+="<dataset seriesname='"<event type>"' color='""' lineThickness='2'>"
 udbList.each{
  dataXML += "<set value='"+it[0]+"'/>" //for that event type populate all count values (1st field in the list)
}
def dataXML = "<graph caption='s' lineThickness='3' rotateNames='1'>" + "
       <categories>
         //Logic to iterate through udbList and insert all dates
        <category name='2011-11-28'/>
        <category name='2011-11-29'/>
        <category name='2011-12-01'/>  
        <category name='2011-12-02'/>
        <category name='2011-12-03'/>
        <category name='2011-12-04'/> 
     </categories>   
    <dataset seriesname='Save Object' color='""' lineThickness='2'>" +
    <set value='132'/>
    <set value='141'/>
    <set value='182'/>
    <set value='0'/>    // 0 because no value for event Save Object on 2011-12-02
    <set value='0'/>    // 0 because no value for event Save Object on 2011-12-03
    <set value='12'/>
    </series>
    <dataset seriesname='Read Object' color='""' lineThickness='2'>"
    <set value='0'/> 
    <set value='133'/>
    <set value='0'/> 
    <set value='119'/>
    <set value='0'/> 
    <set value='0'/> 
    </series>
    <dataset seriesname='Write Object' color='""' lineThickness='2'>"
    <set value='0'/> 
    <set value='0'/> 
    <set value='0'/> 
    <set value='0'/> 
    <set value='11'/>
    <set value='0'/> 
    </series>
</graph>
dataXML+=“”
udbList.each{
dataXML+=“”//对于该事件类型,填充所有计数值(列表中的第一个字段)
}
我已经填充了udbList,如何编写形成dataXML的逻辑

最后,对于上面的示例列表,我应该有这样一个dataXML

udbList=[
      [132, 2011-11-28 00:00:00.0, Save Object], 
          [141, 2011-11-29 00:00:00.0, Save Object], 
          [133, 2011-11-29 00:00:00.0, Read Object], 
          [182, 2011-12-01 00:00:00.0, Save Object], 
          [119, 2011-12-02 00:00:00.0, Read Object], 
          [11, 2011-12-03 00:00:00.0, Write Object], 
          [12, 2011-12-04 00:00:00.0, Save Object]
          ]
dataXML+="<dataset seriesname='"<event type>"' color='""' lineThickness='2'>"
 udbList.each{
  dataXML += "<set value='"+it[0]+"'/>" //for that event type populate all count values (1st field in the list)
}
def dataXML = "<graph caption='s' lineThickness='3' rotateNames='1'>" + "
       <categories>
         //Logic to iterate through udbList and insert all dates
        <category name='2011-11-28'/>
        <category name='2011-11-29'/>
        <category name='2011-12-01'/>  
        <category name='2011-12-02'/>
        <category name='2011-12-03'/>
        <category name='2011-12-04'/> 
     </categories>   
    <dataset seriesname='Save Object' color='""' lineThickness='2'>" +
    <set value='132'/>
    <set value='141'/>
    <set value='182'/>
    <set value='0'/>    // 0 because no value for event Save Object on 2011-12-02
    <set value='0'/>    // 0 because no value for event Save Object on 2011-12-03
    <set value='12'/>
    </series>
    <dataset seriesname='Read Object' color='""' lineThickness='2'>"
    <set value='0'/> 
    <set value='133'/>
    <set value='0'/> 
    <set value='119'/>
    <set value='0'/> 
    <set value='0'/> 
    </series>
    <dataset seriesname='Write Object' color='""' lineThickness='2'>"
    <set value='0'/> 
    <set value='0'/> 
    <set value='0'/> 
    <set value='0'/> 
    <set value='11'/>
    <set value='0'/> 
    </series>
</graph>
def dataXML=”“+”
//遍历udbList并插入所有日期的逻辑
" +
//0,因为2011-12-02上的事件保存对象没有值
//0,因为2011-12-03上的事件保存对象没有值
"
"
因此,当某个日期没有特定事件类型的结果时,我需要插入
'
如何从列表列表中获取此dataXML

更新: 如果您想使用MarkupBuilder在xml中设置一个“set”标记,您需要大致检查MarkupBuilder grails问题(假设数据是假的,并且是日期而不是字符串,这不是最有效的):

输出(假设您的示例输出不是指
):


大致上(不是最有效的,再次假设数据是假的,并且它是日期而不是字符串):

输出(假设您的示例输出不是指
):


您可以使用:

def udbList = [
    [132, "2011-11-28 00:00:00.0", "Save Object"], 
    [141, "2011-11-29 00:00:00.0", "Save Object"], 
    [133, "2011-11-29 00:00:00.0", "Read Object"], 
    [182, "2011-12-01 00:00:00.0", "Save Object"], 
    [119, "2011-12-02 00:00:00.0", "Read Object"], 
    [11, "2011-12-03 00:00:00.0", "Write Object"], 
    [12, "2011-12-04 00:00:00.0", "Save Object"]
]

// Unique dates. 
def dates = udbList.collect { it[1] }.unique()

def xml = new groovy.xml.MarkupBuilder()

xml.graph(caption:'s', lineThickness:'3', rotateNames:'1') {
    categories {
        dates.each { date ->
            // Output dates in yyyy-MM-dd format.
            category(name: date.split()[0])
        }
    }
    series {
        // For each event type output a "dataset" tag and "set" tags for each 
        // date.
        ['Save Object', 'Read Object', 'Write Object'].each { type ->
            dataset(seriesname: type, color: '', lineThickness: '2') {
                dates.each { date ->
                    def val = udbList.find { it[1] == date && it[2] == type}
                    set(value: val ? val[0] : 0)                
                }
            }
        }
    }
}

println xml.toString()
输出为:

<graph caption='s' lineThickness='3' rotateNames='1'>
  <categories>
    <category name='2011-11-28' />
    <category name='2011-11-29' />
    <category name='2011-12-01' />
    <category name='2011-12-02' />
    <category name='2011-12-03' />
    <category name='2011-12-04' />
  </categories>
  <series>
    <dataset seriesname='Save Object' color='' lineThickness='2'>
      <set value='132' />
      <set value='141' />
      <set value='182' />
      <set value='0' />
      <set value='0' />
      <set value='12' />
    </dataset>
    <dataset seriesname='Read Object' color='' lineThickness='2'>
      <set value='0' />
      <set value='133' />
      <set value='0' />
      <set value='0' />
      <set value='119' />
      <set value='0' />
    </dataset>
    <dataset seriesname='Write Object' color='' lineThickness='2'>
      <set value='0' />
      <set value='0' />
      <set value='0' />
      <set value='0' />
      <set value='11' />
      <set value='0' />
    </dataset>
  </series>
</graph>

更新:这几乎与相同,唯一的区别是,此更新考虑了具有多种事件类型的日期。

您可以使用以下方法:

def udbList = [
    [132, "2011-11-28 00:00:00.0", "Save Object"], 
    [141, "2011-11-29 00:00:00.0", "Save Object"], 
    [133, "2011-11-29 00:00:00.0", "Read Object"], 
    [182, "2011-12-01 00:00:00.0", "Save Object"], 
    [119, "2011-12-02 00:00:00.0", "Read Object"], 
    [11, "2011-12-03 00:00:00.0", "Write Object"], 
    [12, "2011-12-04 00:00:00.0", "Save Object"]
]

// Unique dates. 
def dates = udbList.collect { it[1] }.unique()

def xml = new groovy.xml.MarkupBuilder()

xml.graph(caption:'s', lineThickness:'3', rotateNames:'1') {
    categories {
        dates.each { date ->
            // Output dates in yyyy-MM-dd format.
            category(name: date.split()[0])
        }
    }
    series {
        // For each event type output a "dataset" tag and "set" tags for each 
        // date.
        ['Save Object', 'Read Object', 'Write Object'].each { type ->
            dataset(seriesname: type, color: '', lineThickness: '2') {
                dates.each { date ->
                    def val = udbList.find { it[1] == date && it[2] == type}
                    set(value: val ? val[0] : 0)                
                }
            }
        }
    }
}

println xml.toString()
输出为:

<graph caption='s' lineThickness='3' rotateNames='1'>
  <categories>
    <category name='2011-11-28' />
    <category name='2011-11-29' />
    <category name='2011-12-01' />
    <category name='2011-12-02' />
    <category name='2011-12-03' />
    <category name='2011-12-04' />
  </categories>
  <series>
    <dataset seriesname='Save Object' color='' lineThickness='2'>
      <set value='132' />
      <set value='141' />
      <set value='182' />
      <set value='0' />
      <set value='0' />
      <set value='12' />
    </dataset>
    <dataset seriesname='Read Object' color='' lineThickness='2'>
      <set value='0' />
      <set value='133' />
      <set value='0' />
      <set value='0' />
      <set value='119' />
      <set value='0' />
    </dataset>
    <dataset seriesname='Write Object' color='' lineThickness='2'>
      <set value='0' />
      <set value='0' />
      <set value='0' />
      <set value='0' />
      <set value='11' />
      <set value='0' />
    </dataset>
  </series>
</graph>


更新:这几乎与相同,唯一的区别是它考虑了具有多种事件类型的日期。

我应该说这是我能想到的最短解决方案之一……)但是,日期是一个日期,我真的不需要使用xml类型。。。我可以将整个内容存储在字符串或def中。。因为我不确定图表生成器是否接受XML输入。。只需要一个字符串..最后我可以把它转换成一个字符串吗?你还硬编码了系列列表。。如果可能的话,我需要从主列表中删除它。。可能类似于def series=udbList.collect{it[2]}.unique()@pri_dev
toString()
创建一个字符串,如图所示。我看不出有任何理由使用字符串concats,因为在我看来,创建实际的XML更为清晰,这正是您所说的您想要的但是,日期是一个日期,我真的不需要使用xml类型。。。我可以将整个内容存储在字符串或def中。。因为我不确定图表生成器是否接受XML输入。。只需要一个字符串..最后我可以把它转换成一个字符串吗?你还硬编码了系列列表。。如果可能的话,我需要从主列表中删除它。。可能类似于def series=udbList.collect{it[2]}.unique()@pri_dev
toString()
创建一个字符串,如图所示。我看不出有任何理由使用字符串concats,因为在我看来,创建实际的XML更容易,这正是您所说的。我的一个小问题是我的标题,以及一些其他属性是在某个地方检索/形成的,我尝试将它们插入到XML中:XML.graph(标题:“+mycaption+”,线宽:'3',旋转名称:'1')其中def mcoption='user dashboard'@pri\u dev如果
mycaption
是一个变量,则可以将其插入字符串中,如
xml.graph(标题:“\+$mycaption+\”,线宽:'3',旋转名称:'1')
。如果
mycaption==“Something”
,这将为您提供标记
,我不希望字符串周围有+。。。这是连接运算符,我可以直接使用上面的变量名吗?是的,应该也可以。在使用这些动态构建器时,您应该注意的唯一一个问题是,您不能将变量命名为与标记名相同的名称,因为这将在构建XML时导致命名冲突(Groovy将尝试将变量作为函数调用,而不是调用动态XML标记方法)。@pri_dev yes,因为您的第一条注释在字符串中包含了++符号,所以这些符号不存在。您可以单独使用变量,也可以使用
的“cool interpolation:$myVar!!”
的“cool interpolation:${myVar}!!”
在字符串中插入变量。祝你好运我遇到的一个小问题是我的标题,还有一些其他属性是在我尝试将它们插入xml的某个地方检索/形成的:xml.graph(标题:“+mycaption+”,线宽:'3',rotateNames:'1'),其中def mcoption='user dashboard'@pri_dev,如果
mycaption
是一个变量,您可以在字符串中插入它,如
xml.graph(标题:“\+$mycaption+\”,线宽:'3',旋转名称:'1')
。如果
mycaption==“Something”
,则会给您标签
,我不想要++