从ArrayList中删除特定元素
我需要帮助从arrayList中删除刚添加的元素。 我有private static ArrayList<Position> positions = new ArrayList<>()
我添加的对象Position
参数name
,quantity
和price
。比起我有一种方法将对象添加到列表中,并且在第二次添加相同产品的情况下,它应该将数量添加到该名称的第一个对象并删除第二个对象。 到目前为止,我有这个方法从ArrayList中删除特定元素
public void addPosition(Position p) {
for (Position poz: positions) {
if (poz.getname().equals(p.getname())) {
poz.setquantity(poz.getquantity() + p.getquantity());
}
} positions.add(p);
}
添加量工作得很好,但我有问题,与经常性的名字移除元素。
您不应该添加重复的项目,然后删除它们。只需声明一个方法来正确处理添加项目;也就是说,如果项目不存在,它会添加项目,并且如果项目确实存在,则会更新数量。
它应该是这样的:
public void addPosition(Position addition) {
//flag to track whether the new item exists in the list
boolean itemExists = false;
//go through the list looking for an item with the passed name to update
for (Position existing : positions) {
if (existing.getName().equals(addition.getName())) {
existing.setQuantity(existing.getQuantity() + addition.getQuantity());
itemExists = true;
}
}
//if no matching item was found, add the new item
if (!itemExists) {
positions.add(addition);
}
}
以上应该工作。如果您关心性能,最好使用HashMap
,这样您就可以按名称查找Position
,而不是每次循环遍历整个列表。
谢谢,它现在运行良好。 –
如果您有兴趣了解其他数据结构,我建议您HashSet,默认情况下它不会为原始对象插入重复项。 你的情况,你需要做的,你位置类的唯一事情,就是添加 等于和的hashCode方法。因为例如Eclipse的getter和setter将由他自己创建。
hashCode()方法
大家知道这种方法提供了具有对象的代码。基本上,由Object提供的hashCode()的默认实现是通过将内存地址映射为整数值来派生的。如果查看Object类的源代码,您会发现hashCode的以下代码。 public native int hashCode();它表明hashCode是在一定程度上提供内存地址的本地实现。但是可以重写实现类中的hashCode方法。
equals()方法
这种特殊的方法用于使两个对象之间的相等比较。 Java中有两种类型的比较。一个使用“= =”运算符,另一个使用“equals()”。我希望你知道这两者之间的区别。更具体地说,“.equals()”是指等价关系。因此,从广义上讲,你说两个对象是等价的,它们满足“equals()”条件。如果您查看Object类的源代码,您将会找到equals()方法的以下代码。
这里一个完整的工作示例(您可以修改以下这COSE类)
import java.util.HashSet;
public class Zhashset{
private int num;
public Zhashset(){
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + num;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Zhashset other = (Zhashset) obj;
if (num != other.num)
return false;
return true;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
HashSet<Zhashset> hs = new HashSet<Zhashset>();
hs.add(new Zhashset());
hs.add(new Zhashset());
for(Zhashset item : hs)
System.out.println(item.getNum());
}
}
输出将是:写入一次。
可能值得使用'Map'而不是'ArrayList '? –
我对编程比较陌生,这是我迄今为止的想法。我将学习地图并尝试以这种方式进行。谢谢! –