2013-10-09 27 views
0

我在類EarthquakeDataSet中有一個名爲public void mergeSort()的方法,我創建一個對象並嘗試調用一個sort()方法我的MergeSorter類。 MergeSorter類本身不是我的代碼,它是由其他人編寫的,但我應該調用sort()並使用別人編寫的這個類。我得到確切的錯誤是:「方法排序(E [],比較)在類型MergeSorter不適用於參數」試圖調用一個對象的方法,但無法弄清楚參數

我在EarthquakeDataSet方法是這樣的:

public void mergeSort(){ 
MergeSorter obj = new MergeSorter(); 
obj.sort(); 

}

MergeSorter中的方法我試圖調用另一個方法,它也調用另一個方法。這是我的MergeSorter類。

在MergeSorter這三種方法如下:

public static <E> void sort(E[] a, Comparator<? super E> comp) { 
    mergeSort(a, 0, a.length - 1, comp); //calling mergeSort method 
    } 

private static <E> void mergeSort(E[] a, int from, int to, Comparator<? super E> comp){ 
} 

private static <E> void merge(E[] a, int from, int mid, int to, Comparator<? super E> comp) { 

} 

裏面有代碼公平一點,但我只是有麻煩用這些論據來調用。

回答

2

如圖雙方的錯誤消息,並且已經發布了方法的代碼,該sort方法有兩個參數 - 首先的事情數組排序,其次包括Comparator過那些東西來定義排序。

您試圖撥打sort()而沒有任何參數,這是不合法的,不會編譯。 (並且即使它編譯了 - 你會期望做什麼?它究竟是什麼排序?)

您可能需要更新自己的mergeSort方法以將數據作爲參數進行排序。這可能不是必要的,如果它是班級中的一個領域 - 但無論哪種方式,您都需要將該數據傳遞到MergeSorter.sort

+0

我有很多記錄,而且我使用不同的排序方法對所述記錄進行排序。我仍然不確定使用sort方法的參數,但從來沒有使用Comparator作爲參數。 –

+0

那麼,第一個參數將會是你想要排序的記錄數組! [Comparator](http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html)是定義某個類的排序的接口。它通過實現一個函數來實現這一點,該函數採用兩個元素,並說明第一個是「小於」,「等於」還是「大於」第二個。如果要排序的記錄是標準的'ints'或'Strings',那麼Comparator可能已經存在,否則你可能需要編寫自己的(這只是一個簡短的方法)。 –

+0

根據你所說的,它開始變得更有意義。事情是我以多種方式排序。我有這些地震記錄可以根據城市,大小和深度進行排序,所有這些記錄都有來自「EarthquakeRecord []」陣列的變量,但我如何使用比較器作爲第二個參數? –

0

你打電話

obj.sort(); 

但這種方法的簽名如下:

public static <E> void sort(E[] a, Comparator<? super E> comp) 

你要告訴你,你使用了錯誤的參數錯誤,或在此情況下,你根本沒有使用任何參數。

正確用法的一個例子是這樣的:

String[] values = "Hello my name is chris".split(" "); 
obj.sort(values, new Comparator<String>() { 
    public int compare(String s1, String s2) 
    { 
     return s1.compareTo(s2); 
    } 
); 
0

首先,MergeSorter的排序方法是靜態的,所以沒有必要創建對象調用的方法,然後你調用,OBJ 。排序(),這顯然不會將任何參數傳遞給它的簽名是

public static <E> void sort(E[] a, Comparator<? super E> comp) 

你必須通過兩個參數的方法,如例如

class Try<E> implements Comparator<E> 
    { 
     public int compare(E o1, E o2) { 
    //logic here 
    } 

    } 

public class Test { 

    static Try<String>[] a = new Try[5]; 

    public static void main(String[] args) { 
     sort(a, new Try()); 
    } 

    public static <E> void sort(E[] a, Comparator<? super E> comp) 
    { 
     //sort logic 
    } 

    } 

我從main方法調用的方法,在你的情況下,你可以調用像MergeSorter.sort(a,new Try());

希望我清楚。

0

你提到了你正在整理爲「記錄」的東西。通常,在對記錄進行排序時,記錄有多個數據項目,但是您想對一個特定項目進行排序(例如按城市名稱按字母順序排列);或者有時是多個項目(例如,按城市名稱的字母排序,然後在同一城市中按照時間或某物的升序排列)。比較器會是這個樣子:

EarthquakeRecord[] values = <whatever>; 
obj.sort (values, new Comparator<EarthquakeRecord>() { 
    public int compare (EarthquakeRecord r1, EarthquakeRecord r2) { 
     return r1.getCity().compareTo (r2.getCity()); 
    }); 

還是要排序的多個項目:

obj.sort (values, new Comparator<EarthquakeRecord>() { 
    public int compare (EarthquakeRecord r1, EarthquakeRecord r2) { 
     int cityCompare = r1.getCity().compareTo (r2.getCity()); 
     if (cityCompare != 0) 
      return cityCompare; 
     return Integer.compare (r1.getTime(), r2.getTime()); 
      // assuming getTime() returns the time as an integer, somehow 
    }); 

還是以降序排序:

obj.sort (values, new Comparator<EarthquakeRecord>() { 
    public int compare (EarthquakeRecord r1, EarthquakeRecord r2) { 
     return Double.compare (r2.getMagnitude(), r1.getMagnitude()); 
     // this will also work: 
     // return -Double.compare (r1.getMagnitude(), r2.getMagnitude()); 
    }); 

comparecompareTo方法返回一個如果第一個參數較小,則爲負整數;如果第一個參數較大,則爲正整數;如果相等,則爲0。這就是sort所需的全部內容。