数据结构帮助 - 理解思维过程

时间:2015-05-04 14:54:06

标签: java arrays recursion data-structures

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

3 个答案:

答案 0 :(得分:2)

将它视为一棵树显然是要走的路,因为它确实是一棵树。

如果courses的当前值是您想要的节点的父节点,那么可以帮助您思考您希望该方法执行的操作。在您的情况下,如果它是管理节点。在您当前的实现中,您将遍历所有孩子,从未意识到您找到了正确的孩子!

作为另一个提示,您通常会在递归中想要对递归调用的结果执行某些操作。在您的代码中,您调用find(child,name,currentPath),然后对结果不执行任何操作!

希望这些提示对您有所帮助。

答案 1 :(得分: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);
    }

答案 2 :(得分:0)

您的问题包含一些基于意见的(子)问题。这些我们无法回答,但我们可以帮助你的递归算法。

if方法的find分支似乎没问题。当完全匹配时,它进入该分支。问题出在你的else分支中,你需要递归来继续查看子课程。

请注意,您的方法声明返回一个String。

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!
}

首先将递归搜索的返回值分配给某个变量,并定义一个返回值,以便在搜索找不到提供的名称时(您将找不到 Biology < em>管理,例如)。我假设一个空字符串表示搜索没有找到该课程。

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

最后,请注意您要通过附加每个迭代更改currentPath变量的值。如果在第一次迭代后找到名称,那将导致错误的路径。将该迭代的临时路径分配给另一个变量。