2013-02-22 46 views
0

我想我已經走得很遠了,但我處於邏輯掛斷狀態,也許你們有些聰明的人可以幫助我!問題了解插入節點的方法java

public class ItemList{ 

ItemInfoNode head; 
ItemInfoNode tail; 

int listCount = 0; 

public ItemList(){ 

    head = tail = null; 

} 

public void insertInfo(String name, String rfidTag, String initPosition, double price){ 

    ItemInfo obj = new ItemInfo(name, rfidTag, initPosition, initPosition, price); 
    ItemInfoNode temp = new ItemInfoNode(); 
    temp.setInfo(obj); 

    if(head == null){ head = tail = temp; } 

    else{ 

     if(head == tail){//BEGIND SECOND OBJECT HANDLING 

      if(head.getInfo().getTag().compareToIgnoreCase(rfidTag) <= 0){//to see if temp belongs after head 

       head.setNext(temp); 
       temp.setPrev(head); 
       tail = temp; 

      } 

      else{ 

       ItemInfoNode nodePtr = head; 

       head = temp; 
       tail = nodePtr; 
       head.setNext(tail); 
       tail.setPrev(head); 

      } 
     }//END SECOND OBJECT HANDLING 

     else{ 

      if(head.getInfo().getTag().compareToIgnoreCase(rfidTag) > 0){ 

       ItemInfoNode nodePtr = head; 

       head = temp; 
       temp.setNext(nodePtr); 
       temp.getNext().setPrev(head); 

      } 

      else if(head.getInfo().getTag().compareToIgnoreCase(rfidTag) <= 0 && tail.getInfo().getTag().compareToIgnoreCase(rfidTag) > 0){ 

       head.setNext(temp); 
       temp.setPrev(head); 

      } 

      else{//item bigger then tail 

       ItemInfoNode nodePtr = tail; 

       tail = temp; 
       tail.setPrev(nodePtr); 
       tail.getPrev().setNext(tail); 

      } 
     } 
    } 

    listCount++; 

}} 

現在這種方法的目的顯然是要插入它們所屬的節點,但他們需要得到他們的rfidTag字符串,這是一個十六進制數進行排序,我不知道這是否是顯而易見的,但我希望從最小訂單到最大訂單。現在,您可以看到我的代碼變得非常複雜並且很難遵循和處理,但我認爲我很接近,任何人都可以提供任何提示或「邏輯指導」,以幫助我更好地瞭解如何獲取此信息正常工作?在目前的狀態下,它正在銷燬我的列表,有點循環,然後拋出一個NullPointerException!

編輯**:所以我修改了我的代碼並添加了註釋以顯示我期望完成的更簡明的解釋,也許有人可以幫助我理解如何現在使用這些方法?

我現在非常接近,它工作時,我把它們將在列表中的順序對象,但如果我嘗試插入屬於中間某處的對象節點我摧毀我的列表,我沒有看到我的錯誤,任何人都看到了嗎?主要參考

public class Test{ 

public static void main(String args[]){ 

    ItemInfo item = new ItemInfo(null, null, null, null, 0); 

    item.setName("Chocolate"); 
    item.setTag("2"); 
    item.setOrigin("s12345"); 
    item.setCurrent("s12345"); 
    item.setPrice(30.00); 

    ItemInfo item2 = new ItemInfo(null, null, null, null, 0); 

    item2.setName("Buzz Lightyear"); 
    item2.setTag("1"); 
    item2.setOrigin("d67890"); 
    item2.setCurrent("d67890"); 
    item2.setPrice(15.99); 

    ItemInfo item3 = new ItemInfo(null, null, null, null, 0); 

    item3.setName("Hotwheels"); 
    item3.setTag("000000000"); 
    item3.setOrigin("h34743"); 
    item3.setCurrent("h34743"); 
    item3.setPrice(24.25); 

    ItemInfo item4 = new ItemInfo(null, null, null, null, 0); 

    item4.setName("Barbie"); 
    item4.setTag("FFFFFFFFF"); 
    item4.setOrigin("s49862"); 
    item4.setCurrent("s49862"); 
    item4.setPrice(21.22); 

    ItemInfo item5 = new ItemInfo(null, null, null, null, 0); 

    item5.setName("Bicycle"); 
    item5.setTag("CCCCCCCCC"); 
    item5.setOrigin("k28475"); 
    item5.setCurrent("k28475"); 
    item5.setPrice(10.99); 

    ItemInfoNode nood = new ItemInfoNode(); 
    ItemInfoNode nood2 = new ItemInfoNode(); 
    ItemInfoNode nood3 = new ItemInfoNode(); 
    ItemInfoNode nood4 = new ItemInfoNode(); 
    ItemInfoNode nood5 = new ItemInfoNode(); 

    nood.setInfo(item); 
    nood2.setInfo(item2); 
    nood3.setInfo(item3); 
    nood4.setInfo(item4); 
    nood5.setInfo(item5); 

    ItemList list = new ItemList(); 

    list.insertInfo(item.getName(), item.getTag(), item.getCurrent(), item.getPrice()); 
    list.insertInfo(item2.getName(), item2.getTag(), item2.getCurrent(), item2.getPrice()); 
    list.insertInfo(item3.getName(), item3.getTag(), item3.getCurrent(), item3.getPrice()); 
    list.insertInfo(item4.getName(), item4.getTag(), item4.getCurrent(), item4.getPrice()); 
    list.insertInfo(item5.getName(), item5.getTag(), item5.getCurrent(), item5.getPrice()); 

    list.printAll(); 

} 

}

而且我的輸出,以及...

風火輪小汽車 自行車

現在,如果我改變5個對象的rfidTags使下一個比最後一個大,但它的工作,但如果他們現在被放在方式,不會。

回答

1

儘量保持簡單。不要陷入陷阱,將所有不同的「特殊」情況分開。

public void insertInfo(String name, String rfidTag, String initPosition, double price){ 

    ItemInfo obj = new ItemInfo(name, rfidTag, initPosition, initPosition, price); 
    ItemInfoNode addition = new ItemInfoNode(); 
    addition.setInfo(obj); 
    ++listCount; 

    // Walk to the item following: 
    ItemInfoNode insertionNext = head; 
    while (insertionNext != null 
      && insertionNext.getInfo().getTag().compareTo(rfidTag) >= 0) { 
     insertionNext = insertionNext.next; 
    } 

    ItemInfoNode insertionPrevious = insertionNext == null ? tail 
     : insertionNext.previous; 

    // Prepare addition itself: 
    addition.next = insertionNext; 
    addition.previous = insertionPrevious; 

    // The next link backwards should point to the addition: 
    if (insertionNext == null) { 
     tail = addition; 
    } else { 
     insertionNext.previous = addition; 
    } 

    // The previous link forwards should point to the addition: 
    if (insertPrevious == null) { 
     head = addition; 
    } else { 
     insertPrevious.next = addition; 
    } 
} 
+0

是的,我試圖找出如何減少它,但仍然不會錯過任何東西,哇感謝您的幫助 – Sherifftwinkie 2013-02-22 21:06:44

0

好第一關我一直被教導以下結構鏈表

在列表類,你需要以下(在須藤代碼提交)

list class 
{ 
    Node head; 
    Node current; 


    constructor(Object O){ 
    Node n = new Node(O); 
    head = n; 
    current = head; 
} 

void addItem (Object o) 
{ 
    Node n = new Node(o); 
    if(head.nextNode() == null) 
     head.nextNode(n); 
    else 
     current.nextNode(n); 
    current = n; 
} 

} 

正如你可以從我的例子中看到你應該在你的列表類中有兩個節點指針。一個指向列表頭和一個指向當前節點的頭。當你添加一個項目時,首先你設置current.Next然後你發送電流到下一個。這是我認爲你的問題在哪裏。

+0

那麼我有些在方法的某些部分使用了那些臨時的「nodePtr」對象來處理這種問題,所以它現在不是完全是一個問題?真的很難遍歷我的節點,並使用所有這些檢查和While循環來查看哪裏發生了什麼,然後將它粘在它所屬的位置。把我的大腦變成椒鹽脆餅! – Sherifftwinkie 2013-02-22 18:37:12

+0

它會永遠...... – 2013-02-22 18:50:12

+0

你是說你想要做的是把他們的東西放在一個鏈表上? – 2013-02-22 18:50:46