Java - 递归和嵌套任务,不正确的父级

时间:2013-12-12 01:44:43

标签: java recursion arraylist parent-child nested

某些背景:

我正在使用一个系统,该系统使用配置文件传递所有数据;

  • 每个配置文件都有一个ArrayList< Event>事件
  • 每个事件包含一个ArrayList< Task>任务
  • 每个任务包含一个ArrayList< Task>子任务


添加子任务时,系统最终将新的子任务作为主事件的子项,而不是所需的父项。我已将问题缩小到这段代码。


最大的问题:
这一系列方法是否会带来符合条件的(子/子任务)的直接父任务?
(请记住,每个子节点都在父节点内的ArrayList中。)



     //--getParent(Task, Event) finds the nearest parent task of child, if none: null    
        public Task getParent(Task child, Event event){
            Task parent = null;
        for(Task t : event.getTasks()){
            if (t.getId() == child.getId())
                return parent;
        }
        for (Task t : event.getTasks()){
            parent = checkParent(child, t);
            if (parent != null)
                break;
        }
        return parent;
        }

        //--checkParent(Task, Task) checks if child is contained in parent.Subtasks;
        private Task checkParent(Task child, Task parent){
            ArrayList subtasks = parent.getSubtasks();
            for (Task t : subtasks)
            {
                if (t.getId() == child.getId())
                {
                    return parent;
                }
            }
            for (Task t : subtasks)
            {
                parent = checkParent(child, t);
                if (parent != null)
                    break;
            }
            return parent;
        }

<小时/> 为了提供更多的上下文,我正在Android环境中开发。以下是调用父项的调用方法:

public void saveTask(View view)
    {
        Intent intent = new Intent(this, EventTaskViewerActivity.class);
        while (currentEventId != currentParentId && currentParentId != -1){
            Task parent = dataManager.getTask(currentParentId, currentEventId);
            Task superTask = dataManager.getParent(parent, currentEvent);
            if (superTask != null)
                currentParentId = superTask.getId();
            else {
                currentParentId = currentEventId;
                Event e = dataManager.addTaskToEvent(buildTaskFromActivity(), currentEvent);
                dataManager.updateEvent(e);
                break;
            }

        }

        intent.putExtra("CURRENT_USER_ID", androidId);
        intent.putExtra("CURRENT_EVENT_ID", currentEventId);
        startActivity(intent);
    }

1 个答案:

答案 0 :(得分:0)

我不完全确定这段代码与其余代码有什么关系。具体来说,您的问题表明:

  

添加子任务时,系统最终将新的子任务作为a   主要事件的孩子,而不是期望的父母。

但是,您提供的代码位是检索和检查,而不是添加子任务。我认为看到checkParent()方法会有所帮助,也可能会看到添加子任务的方法。

没有它,我注意到的一件事似乎可能不合适:

Task parent = null;
    for(Task t : event.getTasks()){
        if (t.getId() == child.getId())
            return parent;
    }

设置parent = null然后运行循环检查事件中的每个任务。如果任何任务具有与子项相同的ID,则返回空值。在这种情况下,您是想要返回null还是要将Event作为父级返回?