2017-06-16 154 views
0

我需要帮助从arrayList中删除刚添加的元素。 我有private static ArrayList<Position> positions = new ArrayList<>()我添加的对象Position参数namequantityprice。比起我有一种方法将对象添加到列表中,并且在第二次添加相同产品的情况下,它应该将数量添加到该名称的第一个对象并删除第二个对象。 到目前为止,我有这个方法从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); 

} 

添加量工作得很好,但我有问题,与经常性的名字移除元素。

+2

可能值得使用'Map '而不是'ArrayList '? –

+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,而不是每次循环遍历整个列表。

+0

谢谢,它现在运行良好。 –

-1

如果您有兴趣了解其他数据结构,我建议您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()); 
    } 
} 

输出将是:写入一次。

+0

,但这并不能解决他的问题,那就是当一个项目已经在数据中时,它的数量应该被修改。 – nhouser9

+0

是的,你是对的,我的目的只是为了展示另一个数据结构,而不是解决方案,因为你已经写出了解决方案。 – Frank