从另一个列表中的列表中删除对象

时间:2014-08-15 07:12:55

标签: java

我想从list2中的任何内容中删除列表中的元素列表。 我用了removeAll()。 为什么列表不会删除list2中的那些元素?

Element.java

public class Element {

    private String element;

    public Element() {

    }

    public Element(String element) {
        setE(element);
    }


    public String getElement() {
        return element; 
    }

    public void setElement(String element) {
        this.element = element;
    }
}

RemoveAllTest.java

import java.util.ArrayList;
import java.util.List;
public class RemoveAllTest {
    public RemoveAllTest() {
        List<Element> list = new ArrayList<Element>();
        List<Element> list2 = new ArrayList<Element>();

        list.add(new Element("a"));
        list.add(new Element("b"));
        list.add(new Element("c"));

        list2.add(new Element("a"));
        list2.add(new Element("b"));
        list.removeAll(list2);

        for(int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i).getElement());
        }
    }
    public static void main(String[] args) {
        new RemoveAllTest();
    }
}

5 个答案:

答案 0 :(得分:4)

您需要覆盖equals()类中的hashCode()Element方法。

在这种情况下,您必须覆盖equals()方法。但是,好的做法也会覆盖hashCode()

现在让我们尝试解决您的问题。您可以使用以下equals()hashCode()

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (!(o instanceof Element)) return false;

    Element element1 = (Element) o;

    if (element != null ? !element.equals(element1.element) 
                                     : element1.element != null) return false;

    return true;
}

@Override
public int hashCode() {
    return element != null ? element.hashCode() : 0;
}

了解更多信息Why do We need to override the equals and hashCode methods in Java?

答案 1 :(得分:2)

因为这些元素不一样!每当您使用new运算符时,您都会创建新元素!

为了使两个具有相同元素字符串的元素相等 - 您必须覆盖(实现)equals(),例如:

@Override
public boolean equals(Object other){
    if (!( other instanceof Element)) {
        return false;
    }
    Element o = (Element)other;
    if (this.element == null) {
        return o.getElement() == null;
    }
    return this.element.equals(o.getElement());
}

答案 2 :(得分:2)

您的Element类未实现equals。因为它们使用Object.equals()方法,该方法仅测试它是否是完全相同的对象。 (即它是==)。

如果你实现了equals,那么最好也实现hashCode,这样相等的对象就会散列到像Map这样的哈希数据结构中的同一个桶中。

这是你的元素没有这个问题:

public class Element {

    private String element;

    public Element() {

    }

    public Element(String element) {
        setE(element);
    }


    public String getElement() {
        return element; 
    }

    public void setElement(String element) {
        this.element = element;
    }

    public boolean equals(Object other) {
        if (other instanceof Element) {
            Element otherElement = (Element) other;
            if (null == element) {
                return otherElement.element == null;
            }
            return element.equals(otherElement.element);
        }
        return false;
    }

    public int hashCode() {
        if (null == element) {
            return -7;
        }
        return element.hashCode();
    }
}

请注意,我们必须注意元素为null的情况,因为您没有确保元素具有合理的值。如果适当的话,“更好”的元素类可以通过仅提供构造函数来避免这种情况,如果传递给构造函数的字符串为null,或者如果setElement调用采用null值,则该构造函数接受String并抛出IllegalArgumentException。像这样:

public class Element {

    private String element;

    public Element(String element) {
        setElement(element);
    }

    public String getElement() {
        return element; 
    }

    public void setElement(String element) {
        if (null == element) {
            throw new IllegalArgumentException("Element must not be null.");
        }
        this.element = element;
    }

    public boolean equals(Object other) {
        if (other instanceof Element) {
            Element otherElement = (Element) other;
            return element.equals(otherElement.element);
        }
        return false;
    }

    public int hashCode() {
        return element.hashCode();
    }
}

最后,请注意,null ==元素比element == null更好,因为您可以轻松忘记等号并最终为元素赋值null。如果你编写null = element,编译器会抱怨并提醒你删除的字符。

答案 3 :(得分:0)

使用以下Element类可以帮助您。

class Element {

private String element;

public Element() {

}

public Element(String element) {
    setElement(element);
}


public String getElement() {
    return element; 
}

public void setElement(String element) {
    this.element = element;
}

public boolean equals(Object object)
{
    Element now=(Element)object;
    if (object == null || object.getClass() != getClass()) 
    {
        result = false;
    }
    else if(this.getElement().equals(now.getElement()))
    {
        return true;
    }
    else
    {
        return false;
    }
}
public int hashCode() 
 {
    if(element!=null)
      return element.hashCode();
    else
      return 0;
 }
}

答案 4 :(得分:0)

作为其他答案的替代方案,您可以在两个列表中重复使用相同的对象:

Element a = new Element("a");
Element b = new Element("b");
Element c = new Element("c");

list.add(a);
list.add(b);
list.add(c);

list2.add(a);
list2.add(b);
list.removeAll(list2);

for(int i = 0; i < list.size(); i++) {
    System.out.println(list.get(i).getElement());
}

输出:

  

C