2014-01-20 61 views
2

我有一系列名为Task的对象,其字段名为startTime。我将这些对象存储在按startTime排序的链接列表中,并且想要这样做,以便在一个对象中增加startTime将增加其后的所有对象的startTime。这是基本的逻辑我想重复:如何让对象“知道”它是LinkedList中的一个节点?

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

如何我得到Task以了解它使calculateStartTime()可以被包含在Task一个节点,引用相同prevnext的链接列表的引用?

+0

它几乎觉得'startTime'是'Task'所有实例的全局属性。我认为这是一个静态字段,但我不认为100%反映了你试图用来遍历集合的逻辑。 – Makoto

回答

0

你真正需要做一个“链接列表”是让每个任务包含一个任务(列表中的下一个)。问题是,如果你这样做,你不能利用所有内置Java集合的东西,比如排序和迭代器。另一方面,如果你将它保留在传统的链表中,那么你必须迭代列表来找到你想要的那个,所以为什么不继续迭代其余的并且调用每个的计算。你可能甚至不需要它成为一个链表,将一个任务传递给calculateStartTime并称它为好。

我喜欢你正在尝试做的事情,但它可能比其他方法更有价值。

+0

谢谢。我试图保持列表能够进行最佳排序的另一点,但我不知道我需要它。我还没有完全算出另一节中包含的算法;该清单是唯一通过的。我决定创建一个简单的链接列表,并尝试按顺序插入,而不是排序,因为此应用程序中的插入比“startTime”的更改要少得多。 – LMNOP

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

0

您的LinkedList来产生的ListIterator没有扩展和创建你自己的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; 
    } 


} 
+0

我可能最终会这样做,但我宁愿不使用IndexOf。我主要要求获得在Task中直接引用nextNode的速度优势。 – LMNOP

相关问题