2014-01-27 3 views
0

바이너리 파일에서 작동하는 정렬 방법을 쓰고 있습니다. (전체 작업을 메모리에 읽지 않고 파일 내에서 수행 된 모든 작업).자바 : qsort 구현에 비교기 전달

다음과 같이 표시됩니다.qsort 메서드에서 "Comparator 형식의 메서드 비교 (E, E)가 인수 (so)에 적용되지 않음" " 이 표시됩니다.

왜 볼 수 있습니까?

감사합니다.

코드 :

class so { 

    // Some object 

} 

class compareByIntValue implements Comparator<so> { 
    public int compare(so o1, so o2) { 
     // Comparing 
    } 
} 

class StructureOnFile { 

    public static void main(String[] args) throws IOException { 

     RandomAccessFile objectsOnFile = new RandomAccessFile(FILENAME, "rw"); 

     fillWithObjects(objectsOnFile); 
     quickSort(objectsOnFile, RecordSize, new compareByIntValue()); 
. 
. 
. 
     } 

    static <E> void quickSort(RandomAccessFile raf, 
           int RecordSize, Comparator<E> c) throws IOException { 

     quickSort(raf, RecordSize, c, 0, (int) (raf.length() - RecordSize)); 

    } 

    static <E> void quickSort(RandomAccessFile raf, 
            int RecordSize, Comparator<E> c, int first, int last) { 

     if (last > first) { 
      int pivotIndex = partition(raf, RecordSize, first, last, c); 
      quickSort(raf, RecordSize, c, first, pivotIndex - RecordSize); 
      quickSort(raf, RecordSize, c, pivotIndex + RecordSize, last); 
     } 

    } 

    static <E> int partition(RandomAccessFile list, 
           int RecordSize, int first, int last, Comparator<E> c) { 

     so pivot = new so(); 
     so tmp = new so(); 

     list.seek(first); 
     pivot.readFromFile(list); // Reads first element into pivot 
     int low = first + RecordSize; // Index for forward search 
     int high = last; // Index for backward search 

     while (high > low) { 

      // Search forward from left 
      list.seek(low); 
      tmp.readFromFile(list); 
HERE =================> while (low <= high && c.compare(tmp, pivot) <= 0) 
       low+=RecordSize;** 

답변

3

당신은 정말 객체의 특정 유형을 비교하는 일반적인 비교을 복용 일반적인 방법을 기 대해서는 안된다. 메서드의 매개 변수 유형이 Comparator<E> 인 경우 매개 변수가있는 Comparator<T> 인스턴스를 사용할 수 있습니다. so 개체에 대해 compare() 메서드를 호출하고 있습니다. 컴파일러는 그것을 좋아하지 않을 것입니다. 다른 방법으로 Comparator<Integer>을 메서드에 전달하면 어떻게됩니까?

문제를 분류하면 실제로 일반적인 방법이 필요한지 여부를 알아야합니다. 매개 변수 유형을 Comparator<so>으로 변경하는 것만으로는 안됩니까? 의도적으로 제네릭 메소드를 작성 했습니까? 아니면 실제로 어떤 의미인지 모릅니 까? 나중의 것이 사실이라면 제네릭 메소드를 작성하지 마십시오. 따라서 모든 제네릭 메소드를 비 제너릭으로 변경하고 Comparator<E>Comparator<so>으로 변경하십시오. 이렇게하면 다른 문제를 고려하지 않고 문제를 해결할 수 있습니다.

또 다른 방법은 아예 Comparator을 만들지 않도록하고, so 클래스 Comparable<so>을 구현할 수 있도록하고, 무시하고 거기에 compareTo() 메소드를 구현하는 것입니다. 그리고 Comparator 인스턴스를 주위에 전달할 필요가 없습니다. c.compare(tmp, pivot)tmp.compareTo(pivot)으로 바꿉니다.

진지한 점 :Java 명명 규칙을 준수하십시오. so은 실제로 클래스 이름으로 적합하지 않습니다. 분별력있는 이름을 지어 대문자로 시작하는 낙타 케이싱을 따르도록하십시오.

2

Rohit 자이나교는 이미 눈치 :

당신은 정말 일반적인 방법은 컴파일러가 체크를 입력하려면, 당신은 변경해야

개체의 특정 유형을 비교하는 일반적인 비교기를 복용 기 대해서는 안 파티션 방법의 서명 : 당신이 구아이으로

static int partition(..., Comparator<? super so> c) 

전달되는 Comparator 인스턴스가 유형의 객체를 처리 할 수 ​​있으므로입니다.