如何在 Primefaces 的数据表中迭代 Map<String,Collection>
Posted
技术标签:
【中文标题】如何在 Primefaces 的数据表中迭代 Map<String,Collection>【英文标题】:how to iterate Map<String,Collection> in datatable in primefaces 【发布时间】:2013-01-14 17:49:41 【问题描述】:将 JSF 2.1 与 primefaces 一起使用
class FOO
String name;
String value;
public void setName(String name)
this.name=name;
public String getName()
return this.name;
public void setValue(String value)
this.value=value;
public String getValue()
return this.value;
我有一个Map<String, List<FOO>>
标题名称应该是 Map 的 Key。我需要创建多个列(即 Map 的大小),并且每列都应该有 FOO 的列表以在行中显示 FOO.Name。
例如: 如果地图大小为 4
列-----Key1
第一列的行 - List<FOO>
针对 Key1
列--Key2
第一列的行 - List<FOO>
针对 Key2
列-----Key3
第一列的行 - List<FOO>
针对 Key3
列-----Key4
第一列的行 - List<FOO>
针对 Key4
谁能告诉我使用什么组件在 xhtml 页面中显示这种类型的输出?我尝试过使用动态数据表创建,但无法显示。
【问题讨论】:
【参考方案1】:您的数据结构有误。将其更改为正确的数据结构。最简单的方法是在代表rows
属性的List<Map<String, Object>>
中收集数据。 Map
代表列,以列名作为键。将这些列名收集到一个单独的 List<String>
中,它代表 columns
属性。最后通过<p:columns>
展示如下:
<p:dataTable value="#bean.rows" var="row">
<p:columns value="#bean.columns" var="column">
#row[column]
</p:columns>
</p:dataTable>
如果有必要,可以将奇怪的数据结构转换为正确的数据结构(假设每个 List<FOO>
大小相同;否则整个数据结构就没那么有意义了):
Map<String, List<FOO>> wrongDataStructure = createItSomehow();
List<String> columns = new ArrayList<String>(wrongDataStructure.keySet()); // Note I expect LinkedHashMap ordering here.
List<Map<String, Object>> rows = new ArrayList<Map<String, Object>>();
int size = wrongDataStructure.values().iterator().next().size();
for (int i = 0; i < size; i++)
Map<String, Object> row = new HashMap<String, Object>();
for (String column : columns)
row.put(column, wrongDataStructure.get(column).get(i).getName());
rows.add(row);
// Now use "columns" and "rows".
【讨论】:
感谢您澄清这一点。但是,我想知道如何使用这种设置区分普通行和标题行。提前致谢。【参考方案2】:如果不使用技巧,我想不出办法来做到这一点:由于地图中列表的大小可能因每个键集而异,因此您需要知道具有最大项目集的列表的大小。通过知道你可以想出这个奇怪的解决方案:这个想法是在 for 循环中有一个 for 循环。
private Map<String, List<Foo>> fooMap = Maps.newHashMap();
private List<Foo> highestNumberOfFoos;
private init()
highestNumberOfFoos = Lists.newArrayList(new Foo("a", "b"), new Foo("c", "d"), new Foo("e", "f")); // We know that there won't be any list who has more items than this item.
fooMap.put("name1", highestNumberOfFoos);
fooMap.put("name2", Lists.newArrayList(new Foo("g", "h"), new Foo("i", "j")));
...在视图中:
<table>
<thead>
<tr>
<ui:repeat value="#bean.fooMap.keySet().toArray()" var="key">
<td>#key</td>
</ui:repeat>
</tr>
</thead>
<tbody>
<ui:repeat value="#bean.highestNumberOfFoos" var="dummyFoo" varStatus="vs">
<tr>
<ui:repeat value="#bean.fooMap.entrySet().toArray()" var="innerEntry">
<td>#innerEntry.value[vs.index].name</td>
</ui:repeat>
</tr>
</ui:repeat>
</tbody>
</table>
【讨论】:
以上是关于如何在 Primefaces 的数据表中迭代 Map<String,Collection>的主要内容,如果未能解决你的问题,请参考以下文章