如何在Java上正确编写retainAll方法

如何在Java上正确编写retainAll方法,java,linked-list,Java,Linked List,所以基本上我想通过一个列表调用这个方法,它有“嘿,1,2,3,4,兄弟”。在retainAll()的参数中,我有一个名为listB的arraylist集合,其中包含两个元素“Hey”和“Bro”。调用此方法后,listA应该只包含“Hey”和“Bro”。我做了一些调试,但我不知道代码哪里错了。任何帮助都会很好。因此,调用它将如下所示 @Override public boolean retainAll(Collection c) { // TODO Auto-generated meth

所以基本上我想通过一个列表调用这个方法,它有“嘿,1,2,3,4,兄弟”。在retainAll()的参数中,我有一个名为listB的arraylist集合,其中包含两个元素“Hey”和“Bro”。调用此方法后,listA应该只包含“Hey”和“Bro”。我做了一些调试,但我不知道代码哪里错了。任何帮助都会很好。因此,调用它将如下所示

@Override
public boolean retainAll(Collection c) {
    // TODO Auto-generated method stub

    if(c == null)
    {
        throw new NullPointerException("collection is null");
    }
    Iterator itr = c.iterator();

    while( itr.hasNext())
    {   
        if(!c.contains(itr.next()))
        {
            itr.remove();
            return true;

        }
    }

    return false;
}

您迭代了错误的列表-您迭代了
c
的元素,并检查每个元素是否包含在
c
中,因此您没有删除任何内容(如果确实删除了任何内容,您将从错误的列表中删除它)

此外,删除第一个应删除的元素后,不应返回
true
,因为可能需要删除多个元素

应该是:

listA.retainAll(ListB)

您迭代了错误的列表-您迭代了
c
的元素,并检查每个元素是否包含在
c
中,因此您没有删除任何内容(如果确实删除了任何内容,您将从错误的列表中删除它)

此外,删除第一个应删除的元素后,不应返回
true
,因为可能需要删除多个元素

应该是:

listA.retainAll(ListB)

我猜当遇到第一个不匹配的项时,您不想离开循环。如果是这样,为什么要在那里放置一个
return
?我想当遇到第一个不匹配的项时,您不想离开循环。如果是这样的话,为什么要在那里放一个
返回值
?感谢您的指导。在测试之后,我在MyLinkedList$MyLinkedListIterator.remove(MyLinkedList.java:415)在MyLinkedListTester.main的MyLinkedList.Retainal(MyLinkedList.java:227)在MyLinkedListTester.TestRetainal(MyLinkedListTester.java:185)的线程“main”java.lang.UnsupportedOperationException中获得了这些异常(MyLinkedListTester.java:486)@CenturiDamos您没有展示如何实现
iterator()
方法。如果返回不支持
remove()
iterator
,则应添加对
remove()的支持
。啊,谢谢你的指针,在查看了我的迭代器类之后,似乎我让remove方法抛出了一个异常。在寻求进一步指导之前,我将解决这个问题。感谢指导。不过,在测试之后,我在线程“main”中得到了这些异常
异常MyLinkedList$MyLinkedListIterator处的java.lang.UnsupportedOperationException.remove(MyLinkedList.java:415)在MyLinkedList.Retainal(MyLinkedList.java:227)在MyLinkedListTester.TestRetainal(MyLinkedListTester.java:185)在MyLinkedListTester.main(MyLinkedListTester.java:486)处
@CenturiDamos您没有演示如何实现
迭代器()
方法。如果返回的
迭代器不支持
删除()
,则应添加对
删除()的支持
。啊,谢谢你的指针,在查看了我的迭代器类之后,我似乎让remove方法抛出了一个异常。在寻求进一步指导之前,我将解决这个问题。