Java 如何显示自定义OrderedLinkedList类中从列表中删除的元素?

Java 如何显示自定义OrderedLinkedList类中从列表中删除的元素?,java,data-structures,linked-list,doubly-linked-list,Java,Data Structures,Linked List,Doubly Linked List,我正在用嵌套的有序ListNode类实现一个定制的有序LinkedList类。一切都很好,但我正试图通过访问已删除的元素来扩展它 这不是一个要求,但我很好奇这将如何工作,因为我只能使用指示我创建的方法,它们是boolean add(),boolean remove(),和clear() 我还跟踪每次修改,每次成功添加、删除或调用clear(),修改都会增加。我可以简单地创建另一个OrderedLinkedList,并将删除的元素添加到其中,但我觉得这是在添加不必要的修改计数 同样,这部分只是为了

我正在用嵌套的有序
ListNode
类实现一个定制的有序
LinkedList
类。一切都很好,但我正试图通过访问已删除的元素来扩展它

这不是一个要求,但我很好奇这将如何工作,因为我只能使用指示我创建的方法,它们是
boolean add()
boolean remove()
,和
clear()

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

同样,这部分只是为了好玩,不是必需的。我觉得这将使我对创建自定义类有更深的理解

我将展示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方法来存储删除的值。返回类型应为可比,当找到要删除的对象时,将其存储在临时对象中并返回该对象,而不是返回布尔值。当找不到对象时,只需返回null

如果找到要删除的可比较的对象,该方法将返回该对象,以便您可以存储它。如果没有,将返回一个空值,这样您就可以对pop方法使用If check来获取删除是否成功

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

抽样法 测试演示 您的测试代码应该是这样的

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

没错。我只是想实际访问该项目的引用,我觉得您需要使用其他集合来完成此操作。或者在特定的代码中,从每个函数中删除modCOunt++并将其放在main中。然后你可以在任何需要的时候使用modcount++。这很有帮助,但我不能添加任何额外的方法。我只能使用我所拥有的。然而,我做了一个变通办法。我创建了一个与温度相当的静态字段;我声明了您提到的内容(if.obj.equals(element.dataItem)){temp=obj;},然后在删除它之后打印temp,它就工作了!:-)为什么,也许你应该写一个新的类来扩展现有的类,并在扩展的类上添加方法?因为您的实现类是不可见的,我只能假设。如果它有效,那么如果您接受答案,我会很高兴,呵呵,但无论如何,如果它对您有帮助,我会很高兴。实现自定义数据结构是成为一名更好的开发人员的一个非常好的方法,快乐的编码。因为我能够在不添加任何新方法的情况下将您的建议用于temp=obj,所以我将继续接受您的答案。我很惊讶我错过了这么简单的事情。谢谢你的提示。
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();
}