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>