2010-02-08 66 views
0

我有一个java支持bean有一个方法(称为getDataList()),它返回ArrayList<MyType>[h ||丰富]:dataTable不迭代所有对象

MyType.java我有一个setters和getters负载所有这些或者分配String s或String[] s。 一个实例的实例化分配4个对象到ArrayList,含有(除其他)以下数据:

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

以我JSF代码我引用结构成富:数据表。麻烦是这样的表出来:

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

正如你所看到的最后一次迭代是不正确的。我用h:dataTable试过了,发生了同样的情况,所以我知道它可能不是richfaces。但是通过我的Eclipse Java控制台(木卫三/ 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对象中的数据?我应该使用散列表吗?

根据要求这里的相关代码(感谢科林)最小的片段:

这是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的工作,但我认为这不重要。提前致谢。

+0

而不是解释你的代码,只是给它。 – Bozho 2010-02-08 15:43:31

+0

我如何做到这一点当我有600个字符的评论列出它? – volvox 2010-02-08 16:12:15

+0

“UIData”中没有这样的错误,所以填充或访问列表的方式一定是错误的。请发布SSCCE http://sscce.org(即删除所有不相关/不相关的代码混乱,直到您得到最小的可能代码片段,再现完全问题)。 – BalusC 2010-02-08 16:12:51

回答

3

您应该在内部循环中每次创建一个新的对象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 
     } 
    } 
+0

+1斑点。 – BalusC 2010-02-08 16:55:58

+0

非常感谢。 – volvox 2010-02-08 17:09:52