2015-03-16 3 views
1

Как следует из названия, я пытаюсь рекурсивно возвращать массивList объектов Student с gpa выше 3.5. Вот моя попытка.Recursivley возвращает массивList определенных индексов

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. Не знаю, где именно я это привожу.

Мой метод не возвращает нулевой массивList. Не ловите какие-либо индексы с GPA больше 3,5.

Любые идеи? Благодаря

+0

У меня мой метод не возвращает архариста студенческих объектов с gpas больше 3,5. Я уточню в своем посте. @tnw – Andy

+0

ИМЕЕТ быть рекурсивным? – kwikness

+0

Хорошо, тогда что * делает * он возвращается? Это кажется излишне сложным. Почему вы просто не делаете простой цикл 'for'? – tnw

ответ

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); 
     } 
    } 
} 
+0

oh my god .... thank you – Andy

+1

Сделать это 'static' означает, что вам нужно сбросить после каждого использования этого метода, если вы хотите сделать это снова. Передача 'List' в рекурсивном вызове - почти наверняка лучшая практика. –

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); 
     } 
    } 
} 
+0

ugh im идиот. lol thanks – Andy

-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 
    } 
+0

Конечно, это можно сделать нерекурсивно, но прочитать требования к вопросу. – chancea