2017-03-13 3 views
0

ich zur Zeit folgende Struktur haben:Freemarker: Erstellen einer Tabelle mit einer Liste in einer Liste

List<List<ClusterEntry>> clusters = new ArrayList<List<ClusterEntry>>(); 
//fill clusters and the list in clusters 
input.put("clusters", clusters); 

Cluster beschreibt meine Cluster und cluster.get (i) enthält alle Elemente in einem Cluster. Für einen Bericht möchte ich dieses Ergebnis mit Freemarker in eine .md-Datei ausgeben. Ziel ist es, so viele Spalten wie Cluster und in jeder Zeile einen Eintrag des entsprechenden Clusters zu haben. Das Problem, das ich bin vor ist, dass ich mit der äußeren Liste beginnen, was bedeutet, die Cluster:

|<#list clusters as c> Cluster ${c_index} | </#list> 
|<#list clusters as c>-----|</#list> 

Dies ist meine Lösung des Header wird in einer Zeile zu machen. Wenn ich es wie folgt tun:

|<#list clusters as c> Cluster ${c_index} | 
</#list> 

meine Ausgabe wird eine separate Zeile für jeden Cluster $ sein {c_index}

So, jetzt habe ich eine Spalte für jeden der Cluster-Namen, aber wie kann ich füllen die Einträge in einer entsprechenden Zeile aus? Ich brauche die entrys jeden anderen Cluster in seiner entsprechenden separaten Spalte, aber ich weiß nicht, wie das mit Freemarker zu erreichen, wie dieser Code:

<#list clusters as c> 
<#list c as entry>| ${entry.id} |</#list> 
</#list> 

in dem entrys eines führen würde Cluster in einer Reihe und mehr der nächste Cluster in der nächsten Reihe. Ich möchte dies aber mit Spalten

Antwort

1

Wenn ich gut verstehen, dann diese Eingabe gegeben (mit http://freemarker-online.kenshoo.com/ Syntax):

clusters=[["a1", "b1", "c1"], ["a2"], ["a3", "b3"], ["a4", "b4", "c4"]] 
maxEntities=3 

Sie diesen Ausgang wollen (was ich ein bisschen schöner mit padding gemacht haben ... wenn Sie brauchen das, verwenden ?right_pad(n)):

| Cluster 1 | Cluster 2 | Cluster 3 | Cluster 4 | 
|---  |---  |---  |---  | 
| a1  | a2  | a3  | a4  | 
| b1  |   | b3  | b4  | 
| c1  |   |   | c4  | 

Nun, es wird nicht sehr schön sein, wie Sie die Tabelle in der Vorlage drehen möchten. Aber die Idee ist, dass die äußere Schleife die Entitätsindizes durchläuft und die innere Schleife die Cluster durchläuft. (Sie haben auch zwei außergewöhnliche Reihen an der Spitze, die die Clusternamen und die Header-Trennlinie zeigt.)

|<#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> 

BTW, kann maxEntities in der Vorlage berechnet werden, wenn das besser:

<#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> 

und dann hatten Sie <#list 0 ..< maxListItemSize(clusters) as entityIndex>.

+0

Vielen Dank für die Hilfe noch einmal. Die Formatierung ist jetzt genau so, wie ich es versucht habe. Allerdings mit dieser Ausgabe hat die Java-Objekt-ID. Ich möchte zum Beispiel zugreifen: c [entityIndex] .id! in Zeile 4 Ihrer Lösung. Leider bekomme ich dann: FreeMarker Vorlage Fehler: Das folgende hat ausgewertet, um Null oder fehlt: ==> c [entityIndex] [in Vorlage "template.ftl" in Zeile 4, Spalte 26] –

+0

In diesem Fall können Sie schreiben ' (c [entityIndex] .id)! '. Irgendwie komische Syntax, aber ... so funktioniert es. – ddekany

+0

Nun, das dauerte zwei Sekunden und löste meine einstündige Anstrengung von früher. Vielen Dank für die großartige Hilfe! –