我有一个java支持bean,它有一个返回getDataList()
的方法(称之为ArrayList<MyType>
)。
在MyType.java
我有大量的setter和getter,所有这些都指定了String
或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尝试了这个,同样的事情发生了所以我知道它可能不是富有的面孔。但我的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对象中提取数据?我应该使用散列图吗?
根据要求,这里是相关代码的最小片段(感谢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添加到ArrayList中,但我认为这不重要。提前谢谢。
答案 0 :(得分: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
}
}