如何在自定义 OrderedLinkedList class 中显示从列表中删除了哪些元素?

How can I display which elements were removed from list in custom OrderedLinkedList class?

我正在使用嵌套的 Ordered ListNode class 实现自定义 Ordered LinkedList class。一切正常,但我试图通过访问已删除的元素来扩展它。

这不是必需的,但我很好奇这将如何工作,因为我只能使用我被指示创建的方法,它们是 boolean add()boolean remove()clear().

我也在跟踪每次修改,每次成功添加、删除或调用 clear() 都会增加。我可以简单地创建另一个 OrderedLinkedList,并将删除的元素添加到其中,但我觉得我添加了不必要的修改计数。

同样,这部分只是为了好玩,不是必需的。我觉得这会让我更深入地了解创建自定义 classes.

我将展示 remove 和 main 方法。无法更改删除方法签名。

public boolean remove(Comparable obj) {

    for(OrderedListNode element = head.next; element != tail; element = element.next) {

    if(obj.equals(element.dataItem)) { //if element being removed is at the cursor
        OrderedListNode previousNode = element.before;
        OrderedListNode nextNode = element.next;

        nextNode.before = previousNode; //places next element that's after before to the element after current element [prev -> current -> next]

        previousNode.next = nextNode; //places prev of next element to the element before current

        element.dataItem = (Comparable)NOT_FOUND; //removed element is now null

        modCount++; //another modification
        theSize--; //reduce the size by 1
        return true; //if remove is successful
    }
}
return false; //otherwise, not successful removal
}

主要方法:

public static void main(String[] args) {

   OrderedLinkedList list = new OrderedLinkedList();
   OrderedLinkedList removedList = new OrderedLinkedList();

   modCount = 0;
   list.add("Dog");
   list.add("Bird");
   list.add("dog");
   list.add("bird");
   list.add("Cat");
   System.out.println("Before removal of element");
   System.out.println(list);
   list.remove("Dog");
   removedList.add("Dog"); //not what I'm wanting to do
   System.out.println("Removed " + removedList);
   System.out.println("After removal of element");
   System.out.println(list);
   System.out.println("Total modifications = " + modCount);
   System.out.println();
}

输出:

Before removal of element
Bird, Cat, Dog, bird, dog
Removed Dog //not actually accessing the element originally removed. just printing a new list
After removal of element
Bird, Cat, bird, dog
Total modifications = 7 //unnecessary modification due to additional add

如果只想存储删除的元素而不增加修改次数,可以使用ArrayList并将删除的元素放入其中。这样您的修改次数就不会受到影响。

您可以通过实施额外的 pop 方法来存储删除的值。 return 类型应该是 Comparable 并且当找到要删除的对象时,将其存储在 temporary 对象和 return,而不是 returning boolean true。当找不到对象时,只需return null

如果找到要删除的 Comparable 对象,该方法将 return 该对象以便您可以存储它。如果不是,则 null 将 return 以便您可以对 pop 方法使用 if-check 来获取如果删除是成功与否。

这是我刚刚为您编写的示例方法;

流行方法示例

public Comparable pop(Comparable obj) {

    for (OrderedListNode element = head.next; element != tail; element = element.next) {

        Comparable temp = null;     // declaration of the temporary object

        if (obj.equals(element.dataItem)) { // if element being removed is
                                            // at the cursor

            temp = obj;                     // store obj in temp

            OrderedListNode previousNode = element.before;
            OrderedListNode nextNode = element.next;

            nextNode.before = previousNode; // places next element that's
                                            // after before to the element
                                            // after current element [prev
                                            // -> current -> next]

            previousNode.next = nextNode;   // places prev of next element to
                                            // the element before current

            element.dataItem = (Comparable) NOT_FOUND;  // removed element is
                                                        // now null

            modCount++; // another modification
            theSize--; // reduce the size by 1

            return temp; // if remove is successful
        }
    }
    return null; // otherwise, not successful removal
}

测试演示

你的测试代码应该是这样的;

public static void main(String[] args) {

    OrderedLinkedList list = new OrderedLinkedList();
    OrderedLinkedList removedList = new OrderedLinkedList();

    modCount = 0;
    list.add("Dog");
    list.add("Bird");
    list.add("dog");
    list.add("bird");
    list.add("Cat");
    System.out.println("Before removal of element");
    System.out.println(list);

    // list.remove("Dog"); // not needed anymore
    // removedList.add("Dog"); //not what I'm wanting to do

    // pop returns the removed object
    removedList.add(list.pop("Dog"));

    System.out.println("Removed " + removedList);
    System.out.println("After removal of element");
    System.out.println(list);
    System.out.println("Total modifications = " + modCount);
    System.out.println();
}