我有一个列表testMap的地图,而testMap内的列表也有一个地图列表。

testMap = {"list1": list1, "list2" : list2}

list1 = [{"key" : value, "key" : value1},{"key" : value, "key" : value1}]

list2 = [{"key" : value, "key" : value1},{"key" : value, "key" : value1}]


我想根据列表中键的值将testMap分为2个映射testMap1和testMap2。

这就是我尝试过的

<#assign testMap1 = {}>
<#assign testMap2 = {}>

<#list testMap?keys as key>
    <#assign testMapList = testMap[key]>
    <#assign testList1 = []>
    <#assign testList2 = []>
        <#list testMapList as testList>
            <#if actionMap["key1"]??>
                <#if actionMap["key1"] == "test">
                     <#assign ignore = testList1.add(testList)>
                <#elseif actionMap["key1"] == "test1>
                    <#assign ignore = testList2.add(testList)>
                </#if>
            </#if>
        </#list>

        <#if testList1?has_content>
             <#assign ignore = testMap1.put(key, testList1)>
        <#elseif testList2?has_content>
            <#assign ignore = testMap2.put(key, testList2)>
        </#if>

</#list>


但是<#assign ignore = testList1.add(testList)>这行抛出一个错误


“ FreeMarker模板错误:对于“”。“”左操作数:预期为
散列,但这已评估为序列(包装器:
f.t. SimpleSequence):


我不知道该如何实现。任何帮助,将不胜感激。

最佳答案

模板语言并非旨在执行此类操作。您应该将其分解为Java实用程序,您可以从模板中调用它。或者,如果这种重组是有意义的,而与表示形式(格式)无关,则将数据放入已经如此构造的数据模型中。

但是...如果您真的必须在模板中执行此操作,并且testMap没有很多键:

<#assign testMap1 = {}>
<#assign testMap2 = {}>
<#list testMap as k, v>
  <#assign map1V = v?filter(it -> it.key1 == 1)>
  <#if map1V?size != 0>
    <#assign testMap1 = testMap1 + {k: map1V}>
  </#if>

  <#assign map2V = v?filter(it -> it.key1 != 1)>
  <#if map1V?size != 0>
    <#assign testMap2 = testMap2 + {k: map2V}>
  </#if>
</#list>


读取生成的两个映射的速度会很慢,其中N是其中两个顶级键的数量。这就是为什么在那里没有很多键很重要的原因。

在调用O(N) / add时,通常是不可能的。一种解决方法是添加一个实用程序,该实用程序可以创建新的putArrayList,然后可以使用LinkedHashMap等。在这里,myList?api.add(...)允许您访问Java API。但是对于使用?api[]创建的值,这将不起作用;无论如何,这些都不是可变的集合。

关于java - 如何在FTL(Freemarker)中创建 map 列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60630216/

10-10 19:06