2012-10-01 4 views
0

다음과 같은 상황이 발생하여 최상의 솔루션에 대해 궁금합니다. List<Object1>List<Object2>이 있다고 가정하면이 목록은 두 개의 분리 된 검색어의 결과입니다. 둘 다 크기가 같고 ID를 기반으로하는 목록의 요소간에 관계가 1 : 1입니다. 최고의 솔루션은 하나의 DB 쿼리에서 데이터를 가져 오는 것이지만 지금은 가능하다는 것을 알고 있습니다.두 목록의 데이터를 하나의 개체로 결합하십시오.

제 질문은 무엇입니까? List<Object3>에이 목록을 추가하는 가장 좋은 방법은 무엇입니까?

+1

그래서 링크 된 목록입니까? 'list1.get (0)'은 최종 객체에서'list2.get (0)'에 링크 될 것인가? – sp00m

+0

아니요, 조인은 요소 순서가 아닌 ID를 기반으로해야합니다. 예를 들어,'list1.get (23)'은 id가 같기 때문에'list2.get (1)'과 합쳐 져야합니다. –

답변

3

나는

  • 는 오브젝트 1로 ID와 값으로 키를 사용하여지도에 첫 번째 목록을 변환합니다.
  • 두 번째 목록을 반복하여 object2의 ID에 해당하는 object1을 가져옵니다.
  • 병합 작업을 수행하거나 의도 한대로 수행하고 object3을 준비하고 목록에 넣습니다.

결과 순서는 두 번째 목록의 순서입니다.

+0

합리적으로 들리 겠지만, 나는 그것을 시도 할 것이다 : –

+0

고맙다, 그것은 작동했다 –

1

많은 코드를 작성할 필요가 없으므로 Apache Common BeanUtils를 사용하고 데이터 유형 변환도 적절합니다.

이 경우 object1List와 object2List는 모두 ID를 기준으로 동일한 순서 여야합니다. 이러한 오브젝트 1 및 Object2 모두 ID를 기반으로

예제 코드

Object1.java

public class Object1 implements Comparable<Object1>{ 

    private Integer id; 
    private String name; 
    private int quantity; 


    public Integer getId() { 
     return id; 
    } 
    public void setId(Integer id) { 
     this.id = id; 
    } 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public int getQuantity() { 
     return quantity; 
    } 
    public void setQuantity(int quantity) { 
     this.quantity = quantity; 
    } 


    public int compareTo(Object1 compareObject1) { 
     int compareId = ((Object1) compareObject1).getId(); 
     //ascending order 
     return this.id - compareId; 
    } 
} 

Object2.java

public class Object2 implements Comparable<Object2>{ 

    private Integer id; 
    private double amount ; 


    public Integer getId() { 
     return id; 
    } 
    public void setId(Integer id) { 
     this.id = id; 
    } 
    public double getAmount() { 
     return amount; 
    } 
    public void setAmount(double amount) { 
     this.amount = amount; 
    } 

    public int compareTo(Object2 compareObject2) { 
     int compareId = ((Object2) compareObject2).getId(); 
     //ascending order 
     return this.id - compareId; 
    } 
} 

을 정렬이 사용 Comparable 인터페이스를 가지고하려면 Object1와 Object2.java와 같은 필드 명을 가지는 Object3.java

int cnt = 0; 
List<Object3> object3List = new ArrayList<Object3>(); 
List<Object1> object1List = Collections.sort(object1List); 
List<Object2> object2List = Collections.sort(object2List); 

for(Object1 obj1 : object1List) { 
    BeanUtils.copyProperties(obj3, obj1); 
    Object2 obj2 = object2List.get(cnt); 
    BeanUtils.copyProperties(obj3, obj2); 
    object3List.add(obj3); 
    cnt ++; 
} 
+0

'BeanUtils'는'obj3'와'obj1'에 같은 이름으로 선언 된 속성을 요구합니다 –

1

가 id로 확인 쿼리 순서를 확인하고 당신의 새로운 수퍼 목록을 작성하는 동안, 같은 시간에 목록을 반복 실제 구현. 쿼리가 다른 ID 세트를 돌려 주면 (자), 데이터가 파탄합니다. 당신은 수퍼리스트에 두 객체를 추가하기 전에 항상 ID가 일치하는지 확인하기위한 체크를 추가 할 수 있습니다.

0

equals와 hashCode가 ID를 사용하고 있고 객체의 고유성을 나타내는 경우 목록 대신 집합을 사용할 수도 있습니다. 이렇게하면 set1.addAll(set2)

1

BidiMap (Apache Commons Collections 참조)을 사용할 것입니다. 당신이 두 목록은 각 id이 두 목록 내에 존재하는 동일한 크기 및 이 있는지 있다면

또한, 당신은 id으로 목록을 정렬하고 고전에 대한 그들을 통해 갈 수있다 고리.

Comparator<YourObject> comparator = new Comparator<YourObject>() { 
    @Override 
    public int compare(YourObject o1, YourObject o2) { 
     return o1.getId().compareTo(o2.getId()); 
    } 
}; 

Collections.sort(list1, comparator); 
Collections.sort(list2, comparator); 

// import org.apache.commons.collections.BidiMap; 
// import org.apache.commons.collections.bidimap.DualHashBidiMap; 
BidiMap map = new DualHashBidiMap(); 

// required: list1.size() == list2.size() 
for (int i = 0; i < list1.size(); i++) { 
    map.put(list1.get(i), list2.get(i)); 
} 
관련 문제