2014-09-16 3 views
1

Im은 내가 자바에서 전에 건너 온 것을 놀라게했다. 데코레이터 객체를 사용하여이 문제를 해결할 수 있다는 것을 알고 있지만 누구나이 작업을 수행하는보다 간결한 방법을 생각할 수 있는지 궁금합니다.비즈니스 로직 ID로 목록 정렬

ID 목록을받는 방법이 있습니다. 메서드 내에서 일부 조작을 수행하고 db 등에서 개체를 검색합니다. 메서드가 끝나면 결과 목록의 순서가 보장되지 않습니다. 메서드에 전달되는 ID에 ID로 순서를 지정하고 싶습니다. 이 ID는 숫자로 정렬 할 수 없습니다.

서있 예를

List<MyObject> get (List<Integer> ids) { 
    //get from db etc and do manipluation 
    //MyObject contains an id which corresponds to one of the ids passed in 
    //order the list according to the order of the ids parameter 
} 

ID는 순서대로 1,2,3를 포함 할 수 있습니다. 또는 4,7,3,1,7 VO가 반환되기를 원하는 순서대로 ID가 전달 된 순서입니다.

VO를 꾸미고 다른 매개 변수를 추가하여 일부를 허용 할 수 있습니다. 자연 순서지만 이것은 매우 간단한 코드를위한 것 같습니다. 내가 처음에 말했듯이, 임은 이미이 모든 것을 지나서 놀라지 않았다.

좋은 아이디어에 대한 아이디어가 있습니까?

감사합니다.

+0

DB에서 데이터를 가져 오는 중이므로 데이터베이스에서 검색 할 때 정렬하지 마십시오. –

+0

좋은 지적, 나는 데이터베이스 검색에서 사용자 지정 ID 필드를 사용하여 정렬 할 수 있습니다 잊어 버렸습니다. 관심이없는 JPA를 여기에서 점검 할 것입니다. 그러나 여전히 VO를 조작 할 때 문제가있을 수 있다고 생각합니다. 이상적으로는리스트를 사용하고 있다면 조작 – RNJ

+0

의 끝에서 그것을하고 싶습니다. 당신은 equals와 hashcode 메소드를 재정의 한 다음 list.sort를 재정의 할 수 있습니다. –

답변

1

방법이 MyObjects을 비교하는 비교기를 구현하는 방법에 대한 입력으로 가져온 목록을 기반으로 다음이 비교자를 사용하여 MyObject 개체를 정렬 할?

public class MyObjectComparator implements Comparator<MyObject> { 

List<Integer> list; 

MyObjectComparator(List<Integer> list) 
{ 
    this.list = list; 
} 

@Override 
public int compare(MyObject o1, MyObject o2) { 
    return Integer.compare(list.indexOf(o1.getId()), list.indexOf(o2.getId())); 
} 

}

이 코드를 테스트하고이 일을 효율적인 방법이 있는지 확실하지 않습니다 또한 생각하지 않았습니다.

+0

완벽한 감사. 내가 한 것인데 멋진 멋진 솔루션 :) – RNJ

0

나는 개별 ID마다 쿼리를 실행하여 해결할 것입니다. 반복자를 사용하여 목록을 반복하고 모든 ID에 대해 DB 쿼리를 수행하고 결과 목록에 추가하면 내 생각에 반환 ​​된 목록에는 인수 목록의 ID와 동일한 순서로 개체가 포함됩니다. ... 정렬 된 결과

0

예를

은 아마 당신은 하나의 쿼리를 작성하려면 다음 나는 당신의 SQL 쿼리를 수정으로 보일 것이다

private List<MyObject> get(List<Integer> ids) 
{ 
    HashMap<Integer, MyObject> calculated; 
    for (Integer id : ids) 
    { 
    // do fetch work here 
    MyObject object = doWork(id); 
    calculated.put(id, object); 
    } 

    // sorted result 
    LinkedList<Integer> sortedIds = new LinkedList<Integer>(); 
    sortedIds.addAll(ids); 
    Collections.sort(sortedIds); 

    LinkedList<MyObject> sortedResult = new LinkedList<MyObject>(); 
    for (Integer id : ids) 
    { 
    sortedResult.add(calculated.get(id)); 
    } 
    return sortedResult; 
}