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_devtoString()
创建一个字符串,如图所示。我看不出有任何理由使用字符串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”
,则会给您标签
,我不想要++