2014-09-21 98 views
2

很久以來,我一直在重新學習Java,而我正在嘗試編寫一些排序算法。 (相當過時的)教科書我使用了Comparable接口來排序對象。因爲可比較對象現在是泛型類型,所以在編譯時這樣做會給我很多關於原始類型的警告。經過一番研究,它看起來像我可以這樣做,例如:有沒有辦法使用Java泛型類型來編寫排序算法?

public class Sorting 
{ 
    public static <T extends Comparable<T>> void quickSort(T[] list, int start, int end) 
    { 
     /*...*/ 
     while((list[left].compareTo(list[pivot]) < 0) && (left != right)) // for example 
      left++; 
     /*...*/ 
    } 
} 

這樣做的問題是,調用這個方法的簡單的方式不起作用:

public class SortingTest 
{ 
    public static void main(String[] args) 
    { 
     // Produces an error, cannot create arrays of generic types 
     Comparable<Integer>[] list = new Comparable<Integer>[100]; 

     /* fill the array somehow */ 

     Sorting.quickSort(list, 0, 99); 
    } 
} 

這是非法的在Java中創建一個通用類型的數組。如果我嘗試實現合併排序,問題只會變得更糟,因爲這需要在合併排序方法本身內創建Comparable類型的數組。

有什麼辦法可以優雅地處理這種情況?

+0

您可以使用比較器接口http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html – ares 2014-09-21 19:50:05

+0

這不是問題......他想要編寫自己的通用分揀機!你可以重新打開。 – 2014-09-21 19:53:44

+0

請注意,此問題似乎不是關於排序方法的簽名或實現,而是關於如何創建方法的實際參數之一。 – 2014-09-21 19:57:30

回答

3

請注意,T延伸Comparable<T>。它不必Comparable<T>

所以你可以,例如,創建一個整型數組,因爲Integer implements Comparable<Integer>

Integer[] list = new Integer[100]; 
/* fill the array somehow */ 
Sorting.quickSort(list, 0, 99); 
+0

哦,哇,我不敢相信我沒有意識到這一點。但是,是否有可能適應此問題來解決合併排序問題?我不能只是將合併排序方法中的新數組設置爲整數(或雙精度等)數組,因爲這樣它就不能對任意類型進行操作。 – QuantumCop 2014-09-21 20:18:04

+0

@QuantumCop - 由於類型擦除,無法創建通用數組的實例 - 實際的通用類型參數在運行時不可用,但您需要它們來創建數組。所以就地排序更容易。對於mergesort,可以使用臨時數組來創建一個醜陋的黑客 - 創建Object []並將其施放。更清潔的選擇是使用'ArrayList ',它隱藏了相同的黑客攻擊。 – 2014-09-21 20:24:35

+0

@QuantumCop - 我看到這是你的第一個問題。歡迎來到StackOverflow!您可以點擊您認爲有用的多個答案上的向上箭頭。您可以點擊您認爲最有用的答案左側的複選標記。 – 2014-09-21 20:29:22

0

你必須做的Object數組,然後鑄造爲T數組。請注意,這將創建一個編譯器警告。

相關問題