2014-01-27 61 views
0

我在寫一個對二進制文件起作用的排序方法。 (在文件內部完成的所有操作,無需將整個文件讀入內存)。Java:通過一個比較器來執行我的qsort

我得到: 「比較器類型中的方法compare(E,E)不適用於來自qsort方法的參數(so,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

隨着羅希特耆那已經注意到:

你真的應該指望一個通用的方法取一個通用比較器,一個特定類型的對象

對於編譯器類型檢查,你應該改變的分區方法簽名:

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

通過這個你瓜拉尼通過比較器實例傳遞將能夠處理類型的對象,所以