2014-01-20 60 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

相關問題