2010-02-08 3 views
0

ArrayList<MyType>를 반환하는 메서드 (getDataList()라고 함)가있는 Java 백업 빈이 있습니다.[h || rich] : dataTable은 모든 객체를 반복하지 않습니다.

MyType.java MyType.java에서는 setter 및 getter가 모두로드되어 있는데 모두 String 또는 String[]을 할당합니다. 예제 인스턴스화는 다음과 같은 데이터를 포함하는 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로 시도해 보았고 같은 일이 일어나서 아마 부유 한 것이 아님을 알았다. 하지만 내 자바 콘솔을 통해 일식 (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 개체에서 데이터를 올바르게 추출하는 방법을 말할 수 있습니까? 해시 맵을 사용해야합니까?

는 요청에 따라 여기에 관련 코드 (감사 콜린)의 작은 조각이다 :

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

+0

목록에 글자가 600 자있는 경우 어떻게해야합니까? – volvox

+0

'UIData'에는 그러한 버그가 없으므로 목록을 채우거나 접근하는 방법이 잘못되었습니다. SSCCE http://sscce.org를 게시하십시오 (즉, 문제를 정확하게 재현 할 수있는 가장 작은 스 니펫을 얻을 때까지 관련성이 없거나 관련이없는 모든 코드를 제거하십시오). – BalusC

답변

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

+0

대단히 감사합니다. – volvox

관련 문제