【问题标题】:[h || rich]:dataTable not iterating over all objects[h || rich]:dataTable 没有遍历所有对象
【发布时间】:2011-01-14 10:17:04
【问题描述】:

我有一个 java backing bean,它有一个方法(称为getDataList()),它返回一个ArrayList<MyType>

MyType.java 中,我有大量的setter 和getter,它们要么分配Strings 要么分配String[]s。 一个示例实例化将 4 个对象分配给 ArrayList,其中包含(以及其他)以下数据:

fid = 1    ftid = 1
fid = 2    ftid = 1
fid = 3    ftid = 1
fid = 3    ftid = 2

在我的 jsf 代码中,我将结构引用到一个 Rich:dataTable 中。麻烦的是桌子是这样出来的:

fid        ftid
1          1
2          1
3          2      # should be 3, 1
3          2

如您所见,最后一次迭代是不正确的。我已经用 h:dataTable 试过了,同样的情况发生了,所以我知道它可能不是richfaces。但是我的 java 控制台通过 eclipse(ganymede/tomcat6) 显示了正确的分配:

|STDOUT| 2010-02-08 15:23:58,953 | INFO  | [http-8989-5]: adding ftqId 1 feedId 1
|STDOUT| 2010-02-08 15:23:58,984 | INFO  | [http-8989-5]: adding ftqId 1 feedId 2
|STDOUT| 2010-02-08 15:23:59,000 | INFO  | [http-8989-5]: adding ftqId 1 feedId 3
|STDOUT| 2010-02-08 15:23:59,000 | INFO  | [http-8989-5]: adding ftqId 2 feedId 3

谁能告诉我如何正确地从我的 ArrayList 对象中提取数据?我应该使用哈希图吗?

根据要求,这里是相关代码的最小 sn-ps(感谢 Colin):

这是 bean 代码:

public ArrayList<MyType> getFDataList() {
    XMLHandler handler = new XMLHandler();
    dataList = new ArrayList<MyType>();
    try {Document doc = handler.XMLDoc("Config.xml");} // catches removed
    String[] fIds = handler.XMLList("//snip/fid/text()");
    for (String fId : fIds) {           
        MyType tld = new MyType();
        String[] ftIds = handler.XMLList("//snip/ftid/text()");
        for (String ftId : ftIds) {
            tld.setFtId(ftId);
            tld.setFId(fId);        
            logger.info("ftId:"+ftId+",fId:"+fId);
            dataList.add(tld);  // each ft
        }
    }
    return dataList;
}

这是支持类代码:

public class MyType {
    private String fId;
    private String ftId;

    public String getFId() {  
        return fId;  
    }  

    public void setFId(String f) {  
        fId = f;  
    } 

    public String getFtId() {  
        return ftId;  
    }  

    public void setFtId(String fi) {  
        ftId = fi;  
    } 
}

我唯一能想到的是我正在嵌套将对象添加到 ArrayList 的工作,但我认为这并不重要。提前致谢。

【问题讨论】:

  • 不解释你的代码,直接给出。
  • 当我有 600 个字符的评论要列出时,我该怎么做?
  • UIData中没有这样的bug,所以你填充或访问列表的方式一定是错误的。请发布一个 SSCCE sscce.org (即摆脱所有不相关/不相关的代码混乱,直到你得到最小可能的 sn-p 来准确重现问题)。
  • 我怎样才能将代码放在评论中,使其读作code(我注意到这不起作用)?当我搜索代码和 cmets 时,我显然会收到有关评论代码的帖子...
  • 您可以对您的问题进行编辑以添加代码。

标签: java jsp jsf richfaces


【解决方案1】:

您应该每次在内循环中创建一个新的MyType 对象。发生的情况是您只为每个fId 创建一个对象实例,但对于每个ftId,您正在覆盖该值并将其添加到列表中。您最终会获得对同一对象的多个引用。

像这样在内部循环中移动实例化。

   for (String fId : fIds) {         
        String[] ftIds = handler.XMLList("//snip/ftid/text()");
        for (String ftId : ftIds) {  
            MyType tld = new MyType();
            tld.setFtId(ftId);
            tld.setFId(fId);        
            logger.info("ftId:"+ftId+",fId:"+fId);
            dataList.add(tld);  // each ft
        }
    }

【讨论】:

    猜你喜欢
    • 2014-10-07
    • 2012-08-08
    • 1970-01-01
    • 2019-10-09
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多