Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java推断类型和列表:使用通用快速排序示例_Java_List_Quicksort_Comparable_Inferred Type - Fatal编程技术网

Java推断类型和列表:使用通用快速排序示例

Java推断类型和列表:使用通用快速排序示例,java,list,quicksort,comparable,inferred-type,Java,List,Quicksort,Comparable,Inferred Type,我将在Rosettacode上介绍用Java实现的快速排序。据我所知,这应该包含一系列实现可比较接口的东西,并且类型是在运行时推断出来的。我用一个main方法将其封装在一个小类中,但是得到了大量关于推断类型的错误。我对Java比较陌生,还不熟悉这个结构 import java.util.List; import java.util.LinkedList; public class QuickSortExample { public static <E extends Comp

我将在Rosettacode上介绍用Java实现的快速排序。据我所知,这应该包含一系列实现可比较接口的东西,并且类型是在运行时推断出来的。我用一个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);
    }
}
import java.util.List;
导入java.util.LinkedList;
公共类快速排序示例{
公共静电
  • 快速排序方法接受类型为
    X
    的对象的
    列表
    ,并返回类型为
    X
    列表
    。类型
    X
    应与类型为
    X
    的泛型实现
    可比
    接口
  • 可以使用方法
    Arrays.asList()
    将数组转换为列表
  • 方法契约中没有提到
    LinkedList
    ,您可以将任何类型的
    List
    传递给
    quickSort
    方法,它将返回
    List
    类型的对象
    LinkedList
    是该方法内部使用的
    List
    的实现
  • 例:

    Integer[]arr={1,2,3};
    List asList=Arrays.asList(arr);
    快速排序(asList);
    
    我已将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);
        }
    
    publicstaticvoidmain(字符串[]args){
    整数[]arr={2,3,1,6,2,87,5,3546,9,2,3,8111};
    List asList=Arrays.asList(arr);
    List mySortedArray=快速排序(asList);
    System.out.println(mySortedArray);
    }
    

    该算法现在运行得很好。

    非常感谢,还有一个问题,该方法似乎需要传入LinkedList,因为调用了getFirst()。
    Davids iMac:Java david$javac QuickSort.Java QuickSort.Java:10:找不到符号符号符号:方法getFirst()位置:接口Java.util.List E pivot=arr.getFirst()^1错误
    但是如果我试图将asList转换为LinkedList,我会得到一个不兼容的类型错误。我应该如何考虑协调这一错误?在Java中,是否可以制作一个通用的快速排序,以接收实现List接口的任何内容?
    <E extends Comparable<? super E>> List<E> quickSort(List<E> arr) 
    
        Integer[] arr = { 1, 2, 3 };
        List<Integer> asList = Arrays.asList(arr);
        quickSort(asList);
    
    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);
        }