【问题标题】:How to get an object to "know" it's a node in a LinkedList?如何让一个对象“知道”它是 LinkedList 中的一个节点?
【发布时间】:2014-01-20 02:45:21
【问题描述】:

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

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

我如何让Task 知道它是一个节点,以便calculateStartTime() 可以包含在Task 中并引用链接列表引用的相同prevnext

【问题讨论】:

  • 感觉就像startTimeTask 的所有实例的全局属性。我认为这是一个静态字段,但我不认为 100% 反映了您试图用来迭代集合的逻辑。

标签: java linked-list nodes


【解决方案1】:

您真正需要制作“链接列表”的只是让每个任务都包含一个任务(列表中的下一个)。问题是,如果您这样做,您将无法利用 Java 集合中内置的所有内容,例如排序和迭代器。

另一方面,如果您将其保存在传统链表中,则无论如何您都必须遍历列表才能找到所需的列表,所以为什么不继续遍历其余部分并在每个列表上调用计算。你可能甚至不需要它是一个链表,将一个 Task 传递给 calculateStartTime 并称之为好。

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

【讨论】:

  • 谢谢。我正在尝试使列表能够进行最佳排序,但我不确定我是否需要它。我还没有完全解决另一部分中包含的算法;该列表是唯一通过的。我决定创建一个简单的链表并尝试按顺序插入而不是排序,因为在这个应用程序中插入比对 'startTime' 的更改要少得多。
【解决方案2】:

要完全按照您的意愿行事,您必须创建自己的链表,并将 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

【讨论】:

    【解决方案3】:

    如果您想在不扩展和创建自己的 LinkedList 类的情况下执行此操作,请尝试在创建 Task 对象时将 LinkedList 的引用传递给它们。

    示例任务类。

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

    【讨论】:

    • 我可能最终会这样做,但我宁愿不使用 IndexOf。我主要是要求获得在 Task 中直接引用 nextNode 的速度优势。
    猜你喜欢
    • 1970-01-01
    • 2014-10-04
    • 1970-01-01
    • 2017-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多