[英]Can Iterator remove an item not equal to a particular value from the list?
[英]Remove equal item from java list
我有一个项目列表,其中每个项目都是一个包含2个公共字符串的简单类。 我有一个equals方法,只使用两个字符串的equalsIgnoreCase methot。
public class data
{
public String a;
public String b;
public boolean equals(data d)
{
if(a.equalsIgnoreCase(d.a) && b.equalsIgnoreCase(d.b))
{
return true;
}
else
{
return false;
}
}
}
我希望能够删除一个元素,即使它与列表中的元素不同,但是等于它。
现在我这样做:
public void remove(data dataToRemove)
{
for(data i : _list)
{
if(i.equals(dataToRemove))
{
_list.remove(i);
break;
}
}
}
有一个更好的方法吗?
一些评论:
equals
方法不会覆盖Object
的equals
方法(参数应该是Object
类型,而不是data
类型)。 equals
方法来计算空值等。 equals()
时,你也应该覆盖hashcode()
- 如果不是,你可能会在使用Sets或Maps时遇到一些奇怪的行为。 如果正确覆盖equals
方法,则可以使用remove
方法。 请参阅下面的Netbeans生成的自动生成的equals
和hashcode
,修改为使用equalsIgnoreCase
方法。
public static void main(String[] args) {
List<Data> list = new ArrayList<Data>();
list.add(new Data("a", "b"));
list.add(new Data("a", "c"));
System.out.println(list.size()); //2
list.remove(new Data("A", "b"));
System.out.println(list.size()); //1
}
public static class Data {
public String a;
public String b;
public Data(String a, String b) {
this.a = a;
this.b = b;
}
@Override
public boolean equals(Object obj) {
if (obj == null) return false;
if (getClass() != obj.getClass()) return false;
final Data other = (Data) obj;
boolean sameA = (this.a == other.a) || (this.a != null && this.a.equalsIgnoreCase(other.a));
if (!sameA) return false;
boolean sameB = (this.b == other.b) || (this.b != null && this.b.equalsIgnoreCase(other.b));
if (!sameB) return false;
return true;
}
@Override
public int hashCode() {
int hash = 3;
hash = 89 * hash + (this.a == null ? 0 :this.a.toUpperCase().hashCode());
hash = 89 * hash + (this.b == null ? 0 : this.b.toUpperCase().hashCode());
return hash;
}
}
最明确的方法是在没有任何循环的情况下调用列表的Remove方法,并在对象中传入参数。 它使用您在对象上定义的equals方法来查找并删除它(如果它存在于列表中)。
_list.remove(data);
您也不必指定哈希码方法,但是当您在集合或地图等集合中使用它时,您应该养成在重写equals方法时始终创建一个方法的习惯。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.