如何让对象“知道”它是链接列表中的节点?

时间:2014-01-20 02:45:22

标签: java linked-list nodes

我有一系列名为Task的对象,其中包含一个名为startTime的字段。我将这些对象存储在按startTime排序的链接列表中,并希望将其设置为使得在一个对象中增加startTime将增加所有对象之后的startTime它。这是我想要迭代的基本逻辑:

public void calculateStartTime(){
    if(startTime + duration > nextObject.getStartTime()){
        nextObject.setStartTime(startTime + duration);
        nextObject.calculateStartTime;
    }
}

如何让Task知道其节点,以便calculateStartTime()可以包含在Task中,并引用与链接相同的prevnext - 列表参考?

3 个答案:

答案 0 :(得分:0)

要完全按照您的意愿行事,您必须使用Task对象作为节点创建自己的链接列表。例如:

public class Task {
    Task previous, next;
    Date startTime;
    ...
}

在您的调用方法中,您将获得对第一个任务的引用,并且您可以根据需要迭代列表。 这样做可以让你执行你提出的逻辑,但滚动你自己的链表的缺点是你失去了内置的LinkedList的功能。

请使用以下方法检查“助手”类是否对您有益:

calculateStartTime(ListIterator<E> remainderOfList) {
    while(remainderOfList.hasNext()) {
        E element = remainderOfList.next();
        element.calculateStartTime();
    }
}

可以使用listIterator method

从LinkedList生成ListIterator

答案 1 :(得分:0)

如果你想这样做而不扩展并创建你自己的LinkedList类,试着在创建它们时将LinkedList的引用传递给Task对象。

示例任务类。

import java.util.LinkedList;
public class Task {
    int startTime;

    private LinkedList<Task> taskList;
    public Task(LinkedList<Task> taskList){
        this.taskList = taskList; 
    }

    public void calculateStartTime(){

        //your logic
        int duration = 10;

        //check if this task is the last element of the list
        if(taskList.size() > 0 && taskList.getLast() != this){

            int index = taskList.indexOf(this);
            Task nextObject = taskList.get(index + 1);
            if(startTime + duration > nextObject.getStartTime()){
                nextObject.setStartTime(startTime + duration);
                nextObject.calculateStartTime();
            }

        }

    }

    public int getStartTime(){
        return startTime;
    }

    public void setStartTime(int startTime){
        this.startTime = startTime;
    }


}

答案 2 :(得分:0)

您真正需要制作“链接列表”的每个任务都包含一个任务(列表中的下一个)。问题是,如果你这样做,你就无法利用Java Collections中内置的所有东西,比如排序和迭代器。

另一方面,如果你将它保存在传统的链表中,你必须反复遍历列表以找到你想要的那个,所以为什么不继续迭代其余的并在每个上调用calculate。您可能甚至不需要它作为链表,将任务传递给calculateStartTime并调用它。

我喜欢你想要做的事情,但与替代方案相比,它可能比它的价值更多。