2014-09-21 152 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数组。请注意,这将创建一个编译器警告。

相关问题