从ArrayList

时间:2017-06-16 20:12:51

标签: java arraylist

我需要帮助从arrayList中删除刚刚添加的元素。

我有一个private static ArrayList<Position> positions = new ArrayList<>(),我将Position类的对象添加到参数namequantityprice

我有一个方法将对象添加到列表中,如果第二次添加相同的产品,它应该将数量添加到该名称的第一个对象并删除第二个。

到目前为止,我有这种方法:

public void addPosition(Position p) {

    for (Position poz: positions) {
        if (poz.getname().equals(p.getname())) {
            poz.setquantity(poz.getquantity() + p.getquantity());
        }
    } positions.add(p);

}

添加数量工作得很好,但是我在删除带有重复名称的元素方面遇到了问题。

请帮忙。

2 个答案:

答案 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 仅写入一次。