无法理解插入节点的方法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();
}

}

还有我的输出。。。

Hotwheels自行车

现在,如果我更改这5个对象的rfidTags,使下一个对象比上一个对象大,这是可行的,但如果它们按现在的方式放置,就不行了。

尽量保持简单。不要落入陷阱,在不同的"特殊"情况下划分所有。

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

首先,我一直被教导链接列表的以下结构

在您的列表类中,您需要以下(以sudo代码表示)

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

正如您从我的示例中看到的,您的列表类中应该有两个Node指针。一个指向列表的Head,另一个指向当前节点。添加项目时,首先设置当前项目。接下来,您将当前发送到下一个。这就是我认为你的问题所在。

相关内容

  • 没有找到相关文章

最新更新