递归返回特定索引的arrayList

时间:2015-03-16 18:02:17

标签: java recursion arraylist

正如标题所示,我试图以递归方式返回gpa高于3.5的Student对象的arrayList。这是我对此的尝试。

public static ArrayList<Student> honorsStudents(Student[] list, int n) {
    ArrayList<Student> studentsList = new ArrayList<Student>();
    if (n == 0) {
        return studentsList;
    } else {
        boolean currentIsHonors = list[n - 1].isHonors();
        if (currentIsHonors) {
            studentsList.add(list[n - 1]);
            return honorsStudents(list, n - 1);
        } else {
            return honorsStudents(list, n - 1);
        }
    }
}

isHonors()当然确定gpa是否大于3.5。 不确定我到底在哪里搞砸了。

我的方法没有返回null arrayList。没有捕获GPA大于3.5的任何索引。

有什么想法吗?感谢

3 个答案:

答案 0 :(得分:3)

您正在每个方法迭代中创建一个新的ArrayList。这将永远不会递归工作,因为您需要将元素添加到相同的列表。

考虑使用一个基本方法,使用空白列表开始递归,然后为递归的每次迭代传递相同的列表:

//This method takes in the initial values and starts the actual recursion
public static ArrayList<Student> honorsStudents(Student[] list, int n)
{
    return honorStudents(list, n, new ArrayList<Student>());
}

//this is the actual recursive method
public static ArrayList<Student> honorsStudents(Student[] list, int n, List<Student> studentsList)
{
    if (n==0)
    {
        return studentsList;
    }       
    else
    {
        boolean currentIsHonors = list[n-1].isHonors();
        if(currentIsHonors)
        {
            studentsList.add(list[n-1]);
            return honorsStudents(list, n-1, studentsList);
        }
        else 
        {
            return honorsStudents(list, n-1, studentsList);
        }
    }
}

答案 1 :(得分:2)

问题是您正在为每个递归调用创建一个新列表:

 ArrayList<Student> studentsList = new ArrayList<Student>();

您需要在函数之外创建此列表:

static ArrayList<Student> studentsList = new ArrayList<Student>();


public static ArrayList<Student> honorsStudents(Student[] list, int n)
{

    if (n==0)
    {
        return studentsList;
    }       
    else
    {
        boolean currentIsHonors = list[n-1].isHonors();
        if(currentIsHonors)
        {
            studentsList.add(list[n-1]);
            return honorsStudents(list, n-1);
        }
        else 
        {
            return honorsStudents(list, n-1);
        }
    }
}

答案 2 :(得分:-1)

你可以使用这段代码,我认为你不需要递归方法

public static ArrayList<Student> honorsStudents(Student[] list, int n) {
            ArrayList<Student> studentsList = new ArrayList<Student>();
            if (n==0)
            {
            System.out.println("END");
                return studentsList;
            }       
        for(Student s: list{
            if(s.isHonors()){
                studentsList.add(s);
            }
        }
        return studentsList; //all students with isHonors == true
    }