Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 按值从arraylist中删除_Java_Arraylist - Fatal编程技术网

Java 按值从arraylist中删除

Java 按值从arraylist中删除,java,arraylist,Java,Arraylist,我实现了equals(),以便能够按值删除数组列表元素: public boolean equals(Object obj) { if (obj == null) return false; if (obj == this) return true; if (!(obj instanceof Character)) return false; Character ch = (Character) obj; return ch.equals(this); }

我实现了
equals()
,以便能够按值删除数组列表元素:

public boolean equals(Object obj) {
    if (obj == null) return false;
    if (obj == this) return true;
    if (!(obj instanceof Character)) return false;
    Character ch = (Character) obj;
    return ch.equals(this);
}
这是我的arraylist:

static ArrayList<Character> sr = new ArrayList<Character>();
我将删除
a
b
字符:

public static removeChars(){

    ...
    sr.remove('a');
    sr.remove('b');

}

但是最后两项(
g
f
)总是被删除。

如果您在
ArrayList
中使用
java.lang.Character
,则不需要实现
equals
。如果是您自己的
字符
,那么调用
删除
并不是创建类的对象-而是创建标准的
字符
对象,这就是为什么它们不
等于列表中的项目

如果这是问题所在,那么您需要确保将类的实例传递给调用
remove
,而不是依赖于:

或者,如果您使用的是Java 8,则可以显式实现
equalsChar
方法,并在谓词中调用它:

sr.removeIf(c -> c.equalsChar('a'));

这样做的好处是删除所有实例(而不仅仅是第一个实例),这通常是
列表(而不是
集)所需的,而
字符是您编写的自定义类(或者是
java.lang.Character
?)。哪个类包含您发布的
equals
方法?@MickMnemonic它看起来像是在调用
remove
时自动装箱的,这意味着它必须是
java.lang.Character
对吗?虽然我不知道为什么OP会在这种情况下实现自定义的
equals
。是的,在
removeChars
中似乎就是这样,这让我想知道
equals
实现在哪里。似乎问题中省略了很多相关代码。@MickMememonic我猜这是一个自定义字符,OP不知道自动装箱是如何工作的。我已经回答了这个假设。@Mick助记符不,它不是自定义类,
Character
java.lang.Character
sr.remove(new Character('a'));
sr.removeIf(c -> c.equalsChar('a'));