我需要帮助从arrayList中删除刚刚添加的元素。
我有一个private static ArrayList<Position> positions = new ArrayList<>()
,我将Position
类的对象添加到参数name
,quantity
和price
。
我有一个方法将对象添加到列表中,如果第二次添加相同的产品,它应该将数量添加到该名称的第一个对象并删除第二个。
到目前为止,我有这种方法:
public void addPosition(Position p) {
for (Position poz: positions) {
if (poz.getname().equals(p.getname())) {
poz.setquantity(poz.getquantity() + p.getquantity());
}
} positions.add(p);
}
添加数量工作得很好,但是我在删除带有重复名称的元素方面遇到了问题。
请帮忙。
答案 0 :(得分:2)
您不应添加重复的项目,然后将其删除。只需声明一个处理正确添加项目的方法;也就是说,如果该项目不存在,则添加该项目,如果该项目确实存在,则更新该项目。
它应该是这样的:
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
,而不是每次循环遍历整个列表。
答案 1 :(得分:0)
如果您有兴趣了解其他数据结构,我想建议您 HashSet ,默认情况下它不会为原始对象插入重复项。 在您的情况下,您需要对位置类做唯一的事情就是添加 等于和 hashCode 方法。作为getter和setter,例如Eclipse将由他自己创建。
<强> hashCode()方法强>
如您所知,此方法提供了对象的has代码。基本上,Object提供的hashCode()的默认实现是通过将内存地址映射到整数值得出的。如果查看Object类的源代码,您将找到hashCode的以下代码。 public native int hashCode();它表示hashCode是本机实现,它在一定程度上提供了内存地址。但是,可以覆盖实现类中的hashCode方法。
<强>等于()强>
这种特殊方法用于在两个对象之间进行相等的比较。 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());
}
}
输出将: 0 仅写入一次。