0

我正在关注Rosettacode 上这个用 Java 实现的快速排序示例。据我了解,这应该包含实现 Comparable 接口的一系列事物,并且类型是在运行时推断的。我用一个 main 方法将它封装在一个小类中,但是得到了一系列关于推断类型的错误。我对 Java 比较陌生,还不熟悉这个结构。

import java.util.List;
import java.util.LinkedList;

public class QuickSortExample {


    public static <E extends Comparable<? super E>> List<E> quickSort(List<E> arr) {
        if (arr.size() <= 1) return arr;
        E pivot = arr.getFirst();

        List<E> less = new LinkedList<E>();
        List<E> pivotList = new LinkedList<E>();
        List<E> more = new LinkedList<E>();

        for (E i: arr) {
            if (i.compareTo(pivot) < 0) less.add(i);
            else if (i.compareTo(pivot) > 0) more.add(i);
            else pivotList.add(i);
        }

        less = quickSort(less);
        more = quickSort(more);
        less.addAll(pivotList);
        less.addAll(more);
        return less;
     }

     public static void main(String[] args){
        int[] myArray = new int[]{2,3,1,6,2,87,5,3,546,9,2,3,8,111};
        int[] mySortedArray = quickSort(myArray);
        System.out.println(mySortedArray);
    }
}

我在编译时遇到这些错误

 $ javac QuickSortExample.java
 QuickSortExample.java:11: cannot find symbol
 symbol  : method getFirst()
 location: interface java.util.List<E>
        E pivot = arr.getFirst();
                 ^
 QuickSortExample.java:37: <E>quickSort(java.util.List<E>) in QuickSortExample cannot be applied to (int[])
        int[] mySortedArray = quickSort(myArray);
                            ^
 2 errors

我有 3 个问题。

1) 什么?在下面的陈述中是什么意思?

<E extends Comparable<? super E>> List<E> quickSort(List<E> arr) 

2) 由于 getFirst() 方法,这似乎适用于 LinkedList 对象。那是对的吗?如果是这样,我可以让它在一般列表上工作吗?我是否必须将我的整数数组转换为列表。我在这里有点困惑。我一直在咨询ListLinkedList javadocs。

3) 我可以用 List 对象而不是 LinkedList 来完成这一切吗?是否有我不明白的为这个例子选择 LinkedList 的原因?另外,如果我想用一个整数数组来调用它,我是否必须在输入的过程中以不同的方式转换(?)那个输入,因为它看起来不像 Array 从 List 继承?

对于非常基本的问题,抱歉,只是第一次真正学习 Java。

4

2 回答 2

1
  1. 快速排序方法接受一个List类型的对象X并返回一个List类型的X。类型X应该实现Comparable具有泛型类型的接口X
  2. 您可以使用该方法Arrays.asList(<your-array>)将数组转换为列表
  3. LinkedList方法契约中没有提到,你可以将任何类型的 传递ListquickSort方法,它会返回一个类型的对象ListLinkedListList方法内部使用的一个实现。

前任:

    Integer[] arr = { 1, 2, 3 };
    List<Integer> asList = Arrays.asList(arr);
    quickSort(asList);
于 2013-03-29T01:10:58.543 回答
0

我已将 main 方法中的代码更改为以下代码:

public static void main(String[] args){
        Integer[] arr = {2,3,1,6,2,87,5,3,546,9,2,3,8,111};
        List<Integer> asList = Arrays.asList(arr);
        List<Integer> mySortedArray = quickSort(asList);
        System.out.println(mySortedArray);
    }

该算法现在完美运行。

于 2014-05-04T00:44:00.283 回答