【问题标题】:How to remove elements in ArrayList? [duplicate]如何删除 ArrayList 中的元素? [复制]
【发布时间】:2020-05-30 08:07:09
【问题描述】:

以下是示例代码。

如何删除 ArrayList 中的特定元素?


import java.util.ArrayList;

class A {
    int value;

    public A(int newValue) {
        setValue(newValue);
    }

    public int getValue() {
        return value;
    }

    public void setValue(int newValue) {
        value = newValue;
    }
}

class B {

    ArrayList <A> valuesOfA = new ArrayList<>();
    valuesOfA.add(new A(5));
    System.out.println("Adding...");
    for (A value: valueOfA) {
        System.out.println(value); //prints the values added.
    }
    valuesOfA.remove(new A(5));
    System.out.println("Removed");
    for (A value: valueOfA) {
        System.out.println(value);
    }
}

元素仍未被删除。解决办法是什么?

【问题讨论】:

  • 因为您不是在删除同一个对象,而是在删除一个全新的对象。查找 equals() 和 hashcode()。这些定义了对象相等性。
  • 您要删除之前创建的A 的特定实例,还是要根据一个或多个属性值删除一个或多个As?
  • 我正在寻找删除特定实例。
  • 您在问题中写道:remove() 适用于原始数据类型 Java 不允许创建 ArrayList 的原始数据类型。参考Autoboxing and Unboxing

标签: java arraylist


【解决方案1】:

像这样重新定义A类:

Class A
{
    int value;
    public A(int newValue)
    {
        setValue(newValue);
    }
    public int getValue()
    {
         return value;
    }
    public void setValue(int newValue)
    {
         value = newValue;
    }
    public boolean equals(Object o)
    {
         if( o instanceof A)
         {
             return this.value == ((A)o).value;
         }
         return super.equals(o);
    }
}

通过覆盖这个默认使用对象内存地址的方法,您可以定义如何将两个对象视为相同。

您还应该定义hashcode() 方法。

【讨论】:

  • 你还应该定义hashcode()方法也许你可以edit你的答案并提供一个示例实现?
【解决方案2】:

在 Java 中,每个 Class 在某个时候都在扩展 Object。对象有一个方法equals(),每个类都继承该方法。您应该覆盖它以检查传递的对象是否等于当前对象。

它可以解决您的列表问题。让我们看看ArrayList.remove() JavaDoc - 它说:

删除具有最低索引 i 的元素,使得 (o==null ? get(i)==null : o.equals(get(i)))(如果存在这样的元素)。

ArrayList 遍历 List 中的每个条目并调用它的 equals() 方法以将其与传递的 Object 进行比较。 因此,您可以通过覆盖 equals 方法来附加您的 A 类,并让它检查某种属性以确保它是同一个对象。您还可以实现一些其他方法来确保对象相等,例如生成哈希码并比较它们或实际的对象 ID。

关于如何在 A 类上实现这种方式的示例:

Class A
{
    int value;
    public A(int newValue)
    {
        setValue(newValue);
    }
    public int getValue()
    {
         return value;
    }
    public void setValue(int newValue)
    {
         value = newValue;
    }
    @Override
    public boolean equals(Object obj) 
    {
        if(obj != null && obj instanceof A)
        {
            A tmp = (A)obj;
            if(tmp.getValue() == this.value) return true;
            else return false;
        }

        return false;
    }
}

【讨论】:

  • 来自方法equals()的javadoc:注意,只要这个方法被重写,一般都需要重写hashCode方法,以便维护hashCode 方法的通用合同,规定相等的对象必须具有相等的哈希码
【解决方案3】:

虽然您使用相同的值初始化 A 的新对象,但对象不同具有不同的内存,因此您只需删除仅具有该内存位置的现有对象。

我建议你遍历数组并通过过滤找到值 5,然后从数组中删除该元素。

您可以只使用过滤器方法来删除添加的对象。 您的代码将如下所示:

valuesOfA = valuesOfA.stream().filter(obj -> !obj.getValue().equals(5));

现在你的 valuesOfA 数组没有你之前添加的值为 5 的对象

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多