2014-04-22 2 views
1

내가 메모리에 테이블이 프로젝트에서 일하고 있어요 여러 필드로 정렬하려면 :가장 효율적인 방법은 예를 들어, 자바

field1 field2 field3 field4 field5 
somevalue somevalue somevalue somevalue somevalue 
somevalue somevalue somevalue somevalue somevalue 
    . 
    . 
    . 
    . 
    v 

수 있도록 해주는 함수를 작성하는 가장 좋은 방법은 무엇입니까 사용자가 정렬 할 필드의 사전 결정되지 않은 순열을 지정하려면? (예 : 필드 2, 필드 1, 필드 5 순). 지금까지 생각한 최선의 방법은 재귀 함수이지만, 특히 각 열 내에서 행의 '하위 그룹'을 만들고 관리하는 것이 매우 빨리 못 생깁니다. 이 복잡한 방식에 전념하기 전에 누군가가 좀 더 효율적인 방향으로 나를 가리킬 수 있습니까?

그건 그렇고, 내 테이블은 배열의 목록으로 저장됩니다.

답변

2

여기에서 알아야 할 핵심 사항은 검색 알고리즘이 항상 동일하게 유지된다는 것입니다. 변경되는 유일한 것은 실제 비교 기능입니다.

나는 그 compare 방법 데이터를 사용자 공급 장치를 사용하는 사용자 정의 Comparable 클래스 또는 Comparator을의 Arrays 또는 Collections 클래스의 표준 분류를 사용하지만, 쓰기 추천 할 것입니다. 이것은 사실 재미있는 일입니다. 고정 데이터를 사용하는 클래스 인 Comparable 만 작성했습니다. 그러나 이것은 정확히 사용 사례입니다.

당신이해야 할 모든 기능

public int compare(Row row1, Row row2) { 
    // iterate over the columns *in order of the user-supplied priority* 
    // return appropriately 
} 

Here's documentation on the Comparable class을 쓰기입니다.

And Comparator.

당신이 필요로하는 것은 당신이 구현하고있는 것에 달려 있습니다. 세부 사항은 잊지 만 간단해야합니다.

키 # 2의 중요한 점은 우선 앞에 ColumnPrioritiesComparable 클래스 을 인스턴스화 할 수 있다는 것입니다. 우선 순위가 설정됩니다. 예 :

class ColPriComp implements Comparable<ColPriComp> { 
    private volatile int[] priorities; // possibly static, or obtained some other way, 
    // so there's only one shared among all classes 

    @Override 
    public int compareTo(ColPriComp other) { 
     // use "priorities" to do the comparison 
    } 

    public void setPriorities(int[] newPriorities) { 
     this.priorities = newPriorities; 
    } 
} 
+0

내가 이해 한 바로는 'Comparator'는 특정 순열로 테이블을 정렬하는 방법을 지정합니다. 이것은 가능한 모든 시나리오에 대해 'Comparator'를 구현해야한다는 것을 의미합니다. 내가 틀렸다면 나를 바로 잡으십시오. 나는 좀 더 일반적인 것을 필요로합니다. 가능한 모든 순열을 정렬 할 수있는 방법이 필요합니다. – Mike

+0

@Mike는 객체 지향적이라고 생각합니다. 사용자 정의 코드를 한 번만 작성하고 * 작성해야하지만 객체가 인스턴스화 될 때와 정렬 될 때 사이에 변경되는 데이터를 사용할 수 있습니다. – djechlin

+1

@Mike 'compare' 메쏘드와'setPriorities (int [] newPriorities)'메쏘드에 의해 사용될 데이터 멤버로서'private int columnPriorities [];'를 가지는'CustomSortable' 클래스입니다. 그래서 setter가 호출 된 후에'compare' 메쏘드의 동작이 바뀝니다. – djechlin