2012-05-03 62 views
0

所以我有以下方法改變一個方法的簽名

public static <T extends Comparable<? super T>> void bubbleSort(T[] a) 
//public static void bubbleSort(Comparable[] a) 
{ 
    for(int top = a.length-1; top > 0; top--) 
     for(int i = 0; i < top; i++) 
      if(a[i+1].compareTo(a[i]) < 0) 
      { T tmp = a[i]; 

       //Comparabl tmp = a[i]; 
       a[i] = a[i+1]; 
       a[i+1] = tmp; 
      } 
} 

我怎樣才能改變方法簽名,以便能夠從一些這樣稱呼它

public int sortByTitle() 
{ 
    return Sorting.bubbleSort(lib); // (lib is lib = new ArrayList<Object>(); 
} 

,我不能使用收集方法或比較對象。

回答

0

您正在使用.compareTo方法,該方法未由Object類實現,而這類方法不會使您的Bubble Sort工作,因爲將不會執行.compareTo方法。

就你而言,我認爲最好是創建一個實際實現可比接口的項目的數組列表,這與你正在嘗試做的事情相反(改變方法簽名以適應方法調用) 。

一旦你已經這樣做了,你應該能夠通過使用toArray方法將列表轉換爲數組來調用該方法。

值得注意的另一件事是,你的bubbleSort方法不會返回任何東西,因此你的方法調用不應該編譯。

+0

我收到以下編譯消息錯誤:方法bubbleSort在類Sorting不能應用於給定的類型; required:T [] found:java.util.List reason:沒有類型變量(s)T的實例存在,所以參數類型java.util.List 符合形式參數類型T [] 您在此處使用的運算符不能用於您正在使用的值的類型。您要麼在這裏使用錯誤的類型,要麼使用錯誤的操作符。 – valentin

+0

@valentin:正如我的回答中所述,不能傳遞整個對象數組,因爲Object類沒有實現Comparable接口,這是您的冒泡排序機制需要的東西,工作。正如我在答案中所建議的,您將需要使用實現「Comparable」接口的不同數據類型。一旦你這樣做,你應該能夠得到它的工作。 (請注意我提出的其他建議) – npinti

+0

但是,如果我使用像你所建議的數組列表,那是不是意味着我必須使用列表方法來獲取像top和bottom這樣的東西來貫穿它呢?我正在尋找一些不能使用集合方法或比較對象的東西......有點困惑:( – valentin

0

總之,直到確保lib的元素實施Comparable(如果無法比較元素,則無法排序),您將無法執行此操作。

How do I change the method signature in order to be able to call it from something like

你可以改變它,像這樣:

public static <T extends Comparable<? super T>> void bubbleSort(List<T> a) 

但是,更改簽名是不夠的,因爲你不得不使用.size(),而不是.length.get(i)代替[i]等。換句話說,你必須重寫這個方法。

再次,該方法將只適用於Comparable列表,而不是任意列表Object s。