Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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 我的recursiveSort()方法不起作用?(仿制药)_Java_Algorithm_Generics_Recursion - Fatal编程技术网

Java 我的recursiveSort()方法不起作用?(仿制药)

Java 我的recursiveSort()方法不起作用?(仿制药),java,algorithm,generics,recursion,Java,Algorithm,Generics,Recursion,我应该创建一个方法,它接受一个有界泛型类型的ArrayList,并根据对象的体积对它进行排序,使用下面的算法,我必须严格遵循它。绑定应仅允许任何形状对象和子类: if the list size is <= 1 return the list select a middle element from the list and remove it create two lists leftList and rightList for each element in the list

我应该创建一个方法,它接受一个有界泛型类型的ArrayList,并根据对象的体积对它进行排序,使用下面的算法,我必须严格遵循它。绑定应仅允许任何形状对象和子类:

if the list size is <= 1
   return the list
select a middle element from the list and remove it
create two lists leftList and rightList
for each element in the list
   if element is less than the middle element then add element to the rightList
   else add element to leftList
return the combination of recursiveSort(leftList), middle element, and recursiveSort(rightList)
我的Shape类只是一个带有getVolume方法的接口,我的其他类Spheres、Ellioid等覆盖了这个方法

这是我在另一个类中的递归代码,该类执行其他方法,如find min和max:

public class ShapeUtilities {
public static <T extends Shape> Collection<? extends T> recursiveSort(ArrayList<T> list) {

    if (list.size() <= 1) {
        return list;
    }
    int middleIndex = list.size() / 2;
    T middleElement = list.get(middleIndex);
    list.remove(middleIndex);
    ArrayList<T> leftList = new ArrayList<T>();
    ArrayList<T> rightList = new ArrayList<T>();
    for (T item : list) {
        if (item.getVolume() < middleIndex) {
            rightList.add(item);
        } else {
            leftList.add(item);
        }
    }       

    ArrayList<? extends Shape> combination = new ArrayList<T>();
combination.addAll(recursiveSort(leftList));
    combination.add(middleElement);
    combination.addAll(recursiveSort(rightList));
    return combination; 
如何返回recursiveSortleftList、中间元素和RecursiveSortTrightList的组合?它没有添加到我创建的ArrayList中,只是返回中间的元素,而不是全部三个元素

for (int i = 0; i < list.size() - 1; i++) {

您从未对rightList进行排序,您只是简单地按原样进行排序。

是的,我想您的测试需要:

    if (list.get(i).getVolume() < middleElement.getVolume()) {

结合我的各种意见:

第一个问题是

list.size() - 1
这将在每个递归中删除一个元素

然后

不会对rightList进行排序

您最终收到的项目很少的原因是,循环中的略读使用除一个元素之外的所有元素填充leftList,减去中间的元素

最后,您只接收中间元素

最后请注意,代码中没有理由使用旧的for循环。您可以使用快速枚举表示法:

for (T item: list) {
    if (item.getVolume() < middleItem.getVolume()) {
        leftList.add(item);
    } else {
        rightList.add(item);
    }
}

这样可以确保在整个列表中进行枚举,而不会出现索引模糊或错误风险,例如循环到list.size-1

这是一个快速排序您错过了对rightListlist.geti.getVolume的递归排序调用list.get(i).getVolume() < middleIndex
list.get(i).getVolume() < middleElement.getVolume()
combination.addAll(rightList);
for (T item: list) {
    if (item.getVolume() < middleItem.getVolume()) {
        leftList.add(item);
    } else {
        rightList.add(item);
    }
}