如何在 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&lt;String, List&lt;FOO&gt;&gt;

标题名称应该是 Map 的 Key。我需要创建多个列(即 Map 的大小),并且每列都应该有 FOO 的列表以在行中显示 FOO.Name。

例如: 如果地图大小为 4

列-----Key1

第一列的行 - List&lt;FOO&gt; 针对 Key1

列--Key2

第一列的行 - List&lt;FOO&gt; 针对 Key2

列-----Key3

第一列的行 - List&lt;FOO&gt; 针对 Key3

列-----Key4

第一列的行 - List&lt;FOO&gt; 针对 Key4

谁能告诉我使用什么组件在 xhtml 页面中显示这种类型的输出?我尝试过使用动态数据表创建,但无法显示。

【问题讨论】:

【参考方案1】:

您的数据结构有误。将其更改为正确的数据结构。最简单的方法是在代表rows 属性的List&lt;Map&lt;String, Object&gt;&gt; 中收集数据。 Map 代表列,以列名作为键。将这些列名收集到一个单独的 List&lt;String&gt; 中,它代表 columns 属性。最后通过&lt;p:columns&gt;展示如下:

<p:dataTable value="#bean.rows" var="row">
    <p:columns value="#bean.columns" var="column">
        #row[column]
    </p:columns>
</p:dataTable>

如果有必要,可以将奇怪的数据结构转换为正确的数据结构(假设每个 List&lt;FOO&gt; 大小相同;否则整个数据结构就没那么有意义了):

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>的主要内容,如果未能解决你的问题,请参考以下文章

如何使值的外键显示在primefaces数据表中

如何以编程方式重新排序primefaces数据表中的列

如何在 Primefaces 数据表中表示嵌套数据?

如何从 PrimeFaces 数据表自定义分页器

PrimeFaces 数据表中的屏蔽数字

primefaces 中 如何得到表格的总行数