Java Freemarker:在列表中创建具有列表的表
我目前有以下结构:Java Freemarker:在列表中创建具有列表的表,java,markdown,freemarker,Java,Markdown,Freemarker,我目前有以下结构: List<List<ClusterEntry>> clusters = new ArrayList<List<ClusterEntry>>(); //fill clusters and the list in clusters input.put("clusters", clusters); clusters描述我的集群,cluster.geti包含一个集群中的所有元素。对于一个报表,我想将这个结果与freemarker一起输
List<List<ClusterEntry>> clusters = new ArrayList<List<ClusterEntry>>();
//fill clusters and the list in clusters
input.put("clusters", clusters);
clusters描述我的集群,cluster.geti包含一个集群中的所有元素。对于一个报表,我想将这个结果与freemarker一起输出到一个.md文件中,目标是拥有与集群一样多的列,并且在每一行中有一个对应集群的条目。
我面临的问题是,我必须从外部列表开始,即集群:
|<#list clusters as c> Cluster ${c_index} | </#list>
|<#list clusters as c>-----|</#list>
这是我的解决方案,使标题在一行中。如果我这样做:
|<#list clusters as c> Cluster ${c_index} |
</#list>
对于每个集群${c_index},我的输出将是一个单独的行
现在每个集群名称都有一列,但是如何填写对应行中的条目呢?我需要每个不同集群在其相应的单独列中的入口,但我不知道如何使用freemarker实现这一点,因为以下代码:
<#list clusters as c>
<#list c as entry>| ${entry.id} |</#list>
</#list>
将导致一个集群的入口位于一行,下一个集群位于下一行。我想要这个,但如果我理解得很好,那么使用以下语法给出此输入: 你想要这个输出,我已经做了一个更好的填充。。。如果需要,请使用?右键: 好吧,它不会很漂亮,因为你想在模板中旋转表格。但是,这个想法是外循环通过实体索引,内循环通过集群。顶部还有两个例外行,显示集群名称和标题分隔行
|<#list clusters as c> Cluster ${c?counter} <#sep>|</#list>|
|<#list clusters as c>--- <#sep>|</#list>|
<#list 0 ..< maxEntities as entityIndex>
|<#list clusters as c> ${c[entityIndex]!} <#sep>|</#list>|
</#list>
然后你就有了。再次感谢你的帮助。现在的格式化正是我想要实现的。但是,此输出具有java对象id。我想访问例如:c[entityIndex].id!在解决方案的第4行。遗憾的是,我收到了:FreeMarker模板错误:以下内容的计算结果为null或缺失:==>c[entityIndex][在template template.ftl的第4行第26列]中,在这种情况下,您可以编写c[entityIndex].id!。有点奇怪的语法,但是。。。这就是它的工作原理。好吧,这花了我两秒钟的时间,解决了我之前一个小时的努力。非常感谢你的帮助!
| Cluster 1 | Cluster 2 | Cluster 3 | Cluster 4 |
|--- |--- |--- |--- |
| a1 | a2 | a3 | a4 |
| b1 | | b3 | b4 |
| c1 | | | c4 |
|<#list clusters as c> Cluster ${c?counter} <#sep>|</#list>|
|<#list clusters as c>--- <#sep>|</#list>|
<#list 0 ..< maxEntities as entityIndex>
|<#list clusters as c> ${c[entityIndex]!} <#sep>|</#list>|
</#list>
<#function maxListItemSize items>
<#local max = 0>
<#list items as item>
<#local size = item?size>
<#if max < size>
<#local max = size>
</#if>
</#list>
<#return max>
</#function>