我想从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();
}
}
答案 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