【问题标题】:how to iterate Map<String,Collection> in datatable in primefaces如何在 Primefaces 的数据表中迭代 Map<String,Collection>
【发布时间】: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 页面中显示这种类型的输出?我尝试过使用动态数据表创建,但无法显示。

【问题讨论】:

    标签: jsf-2 collections primefaces datatable loops


    【解决方案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>
    

    【讨论】:

      猜你喜欢
      • 2014-11-08
      • 2013-12-18
      • 2013-05-17
      • 1970-01-01
      • 2018-01-06
      • 2015-12-05
      • 1970-01-01
      • 2016-01-12
      • 2019-01-30
      相关资源
      最近更新 更多