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

Cen*_*mos 1 java linked-list

@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;
}
Run Code Online (Sandbox Code Playgroud)

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

listA.retainAll(ListB)
Run Code Online (Sandbox Code Playgroud)

Era*_*ran 5

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

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

它应该是:

public boolean retainAll(Collection c) {  
    if(c == null)
    {
        throw new NullPointerException("collection is null");
    }
    Iterator itr = iterator(); // i.e. iterate over this list

    boolean found = false;
    while(itr.hasNext())
    {   
        if(!c.contains(itr.next()))
        {
            itr.remove(); 
            found = true; 
        }
    }

    return found;
}
Run Code Online (Sandbox Code Playgroud)