2015-05-04 3 views
0
public class Example { 

    private static class Courses { 
     public final String name; 
     public final Courses[] children; 

     public Courses(String name, Courses ... children) { 
      this.name = name; 
      this.children = children; 
     } 
    } 

    public static void main(String[] args) { 


     Courses courses = 
       new Courses("School", 
         new Courses("Mathematics", 
           new Courses("Algebra"), 
           new Courses("Trig"), 
           new Courses("Calculus"), 
           new Courses("Calculus 2"), 
           new Courses("Geometry")), 
         new Courses("Sciences", 
           new Courses("Biology"), 
           new Courses("Chemistry"), 
           new Courses("Physics"), 
         new Courses("Business", 
           new Courses("Finances", 
             new Courses("Accounting"), 
             new Courses("Accounting 1"), 
             new Courses("Accounting 2"), 
           new Courses("Administration", 
             new Courses("Economics"), 
             new Courses("Business Studies"), 
             new Courses("Administration 1"), 
             new Courses("Accounting"))), 
         new Courses("Physical Education")))); 


        System.out.println(find(courses, "Economics", courses.name)); 

     public static String find(Courses courses, String name, String currentPath) { 

     if((courses.name).equals(name)){ 

      System.out.println(currentPath); 

      return currentPath + "/" + name; 

     } 
     else{ 
      //System.out.println(currentPath); 
      for(Courses child:courses.children){ 

       currentPath += "/" + child.name; 

       find(child, name, currentPath); 
      } 

     } 

     return currentPath + "/" + name; 

    } 
} 

Так что это код, который я приобрел. Я пытаюсь определить, какова должна быть правильная модель мышления при кодировании этого метода поиска. Это массив, но я думаю об этом как о дереве, как об этом, и пытаюсь найти ответ. Это то, что вы, ребята, тоже сделали бы? Я пытаюсь найти такой путь, как эта школа/бизнес/администрация/экономика. Но либо я получаю весь путь, либо все это повторяется. Кроме того, каков подход, который вы, ребята, предпримете для этого. Я написал рекурсивный метод для достижения этого, но он не работает.Справка по структуре данных - Понимание мыслительного процесса

Спасибо, за вашу помощь

CC

+0

Ваш вопрос не очень ясен. Является ли проблема структурой данных или реализацией рекурсивного метода? – daphshez

+0

Ну, структура данных, как в мышлении за решение такой проблемы. И тогда, очевидно, я столкнулся с проблемой с методом, использующим рекурсию, таким образом, id, что бы вы пошли, или вы бы использовали что-то еще, чтобы показать путь? – CalmestChaos

ответ

0

Я хотел бы сделать что-то вроде этого

Course.java

public class Course { 
    private Course parentCourse; 
    private String name; 

    public Course(String name){ 
     this.setName(name); 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public Course getParentCourse() { 
     return parentCourse; 
    } 

    public void setParentCourse(Course parentCourse) { 
     this.parentCourse = parentCourse; 
    } 
} 

Courses.java

public class Courses { 
    private List<Course> courses; 

    public Courses(){ 

    } 

    public List<Course> getCourses() { 
     return courses; 
    } 

    public void setCourses(List<Course> courses) { 
     this.courses = courses; 
    } 
} 

Главная

Courses courses = new Courses(); 
    List listCourses = new ArrayList<Course>(); 

    Course generalMaths = new Course("General Maths"); 
    Course linAlgebra = new Course("Linear Algebra"); 
    linAlgebra.setParentCourse(generalMaths); 

    listCourses.add(generalMaths); 
    listCourses.add(linAlgebra); 

    courses.setCourses(listCourses); 

Найти путь

for(Course course : courses.getCourses()){ 
     StringBuffer coursePath = new StringBuffer(); 
     coursePath.append(course.getName()); 
     while(course.getParentCourse() != null){ 
      course = course.getParentCourse(); 
      coursePath.append(" | "+course.getName()); 
     } 
     System.out.println(coursePath); 
    } 
+0

Ой! Благодаря! Но сосредоточиться на коде, который я положил, думать об этом. Как в качестве дерева, а затем используя рекурсивный метод для поиска пути, это хороший подход? Как бы вы могли найти путь, если вам нужно было отредактировать метод поиска? – CalmestChaos

+0

Я обновил свой ответ с помощью поиска путей. Это требует некоторой работы над заказом, потому что сейчас оно отменено. –

2

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

Это может помочь вам подумать о том, что вы ожидаете от метода, если текущее значение courses было родителем нужного вам узла. Это в вашем случае, если это узел администрирования. В вашей текущей реализации вы будете перебирать всех детей, никогда не понимая, что вы нашли правильного ребенка!

Как еще один намек, вы, как правило, в рекурсии хотите что-то сделать с результатом рекурсивного вызова. В вашем коде вы вызываете find (child, name, currentPath), а затем ничего не делаете с результатом!

Надейтесь, что эти подсказки помогут вам.

+0

Ну, я помещаю в «Экономика», например, в вызов метода find, а затем я пытаюсь вернуть currentPath с именем. Однако он всегда выходит из цикла и отображает «Школа/Математика/Наука/Бизнес/Физическая культура/Экономика». И это не то, что я хочу – CalmestChaos

0

Ваш вопрос содержит некоторые основанные на мнении вопросы. На это мы не можем ответить, но мы можем помочь с вашим рекурсивным алгоритмом.

if ветка вашего find способ кажется в порядке. Он входит в эту ветвь, когда происходит точное совпадение. Проблема заключается в вашей ветке else, где вам нужна рекурсия, чтобы продолжать смотреть на курсы для детей.

Обратите внимание, что в объявлении метода возвращается строка.

public static String find(Courses, String, String) 

И обратите внимание, что, когда вы рекурсивно вызвать эту функцию, вы игнорируете его возвращаемое значение, что делает рекурсивный вызов бесполезно.

for (Courses child: courses.children) { 
    currentPath += "/" + child.name; 
    find(child, name, currentPath); // <-- this return value is being ignored! 
} 

Start путем присвоения возвращаемого значения рекурсивного поиска некоторых переменные, и определить значение, возвращаемое, если поиск не находит прилагаемое имя (вы не найдете биологии под Администрацией, например). Я предполагаю, что пустой String означает, что поиск не нашел курс.

String result = find(child, name, currentPath); 
if (!result.isEmpty()) { 
    // it has been found 
} 

Наконец, обратите внимание, что вы изменяете значение переменной currentPath на каждой итерации, путем добавления к нему. Это приведет к ошибочным путям, если имя найдено после первой итерации. Назначьте этот временной путь для этой итерации другой переменной.

+0

Итак, нужно ли просто делать nextPath = currentPath и возвращать nextPath? – CalmestChaos

+0

@CalmestChaos Начните с присвоения 'currentPath'' nextPath', а затем добавьте имя дочернего элемента к следующему пути, поэтому вы всегда сохраняете исходный путь, если ваш рекурсивный вызов не находит курс. Вы меняете исходный 'currentPath', и именно поэтому вы получаете эти странные результаты со всеми курсами для детей. – afsantos

+0

Итак, я сделал это, и когда я делаю System.out для nextPath в цикле, он показывает этот путь в одной из итераций, однако окончательное возвращение - это школа/физическое образование/экономика. – CalmestChaos