我有一个列表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
时,通常是不可能的。一种解决方法是添加一个实用程序,该实用程序可以创建新的put
或ArrayList
,然后可以使用LinkedHashMap
等。在这里,myList?api.add(...)
允许您访问Java API。但是对于使用?api
或[]
创建的值,这将不起作用;无论如何,这些都不是可变的集合。关于java - 如何在FTL(Freemarker)中创建 map 列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60630216/