数据在ArrayList中自动修改

时间:2015-08-04 21:36:48

标签: java android arraylist

我有两个ArrayLists:

private ArrayList<MenuItemBean> newList= new ArrayList<MenuItemBean>();  
private ArrayList<MenuItemBean> newGroupList= new ArrayList<MenuItemBean>();  

在一个函数中,我将数据添加到一个ArrayList:

public void setConfirmList(List<MenuItemBean> cList){
    newList.addAll(cList);
    listAdapter=new ListAdapter(context, newList);
    lv_item.setAdapter(listAdapter);
}  

另一个功能,我只是使用for循环对数据进行分组(如果产品已经存在,则增加数量)并将数据添加到第二个ArrayList。但我的问题是当我在ArrayList2中增加数量时,我在ArrayList1中的数量会自动修改。我知道它是因为对象的相同参考。我们可以通过任何方式改变这种行为。

private void groupList(){

    newGroupList.clear();

    ArrayList<MenuItemBean> mList= new ArrayList<MenuItemBean>();
    mList.addAll(newList);

    for (int i = 0; i < mList.size(); i++){
        String productId = mList.get(i).getProductId();
        if(newGroupList.size()==0){
            newGroupList.add(mList.get(i));
        }else{ 
            Boolean bool=false;
            for (int j = 0; j< newGroupList.size(); j++){
                if(productId.equalsIgnoreCase(newGroupList.get(j).getProductId())){
                    bool= true;
                    //                      MenuItemBean newObject = new MenuItemBean(); 
                    //                      BeanUtils.copyProperties(newObject, newGroupList.get(j));
                    MenuItemBean bean= newGroupList.get(j);
                    int quantity = Integer.parseInt(bean.getUserQuantity());
                    Double sellingPrice = Double.parseDouble(bean.getSellingPrice());
                    quantity = quantity + 1;
                    sellingPrice = sellingPrice * quantity;
                    bean.setUserQuantity(String.valueOf(quantity));
                    bean.setUserPrice(String.valueOf(sellingPrice));
                    newGroupList.set(j, bean);
                    break;
                }
            }
            if(!bool){
                newGroupList.add(mList.get(i));
            }
        }
    }
    listAdapter=new ListAdapter(context, newGroupList);
    lv_item.setAdapter(listAdapter);
}

我还尝试使用

复制ArrayList
ArrayList newGroupList= new ArrayList<MenuItem>(newList);

但没有帮助它简单复制数据但不是参考。我试过但没有任何例子来实现它。

1 个答案:

答案 0 :(得分:0)

  

但没有帮助它简单复制数据而不是参考。

你是对的。通过创建新列表并将数据项添加到新列表,它不是复制对象存储器。这些列表中的两个项都指向堆中的相同内存地址。因此,当您修改其中一个列表中的数据项时。这也会影响其他数据项。例如

public static void main(String[] args) {
    List<ObjectItem> datas = new ArrayList<ObjectItem>();
    ObjectItem obj1 = new ObjectItem();
    obj1.setId(1);
    datas.add(obj1);
    System.out.println("memory addrs for obj1:" + datas.get(0)); //memory addrs for obj1: 533e846f
    List<ObjectItem> other_datas = new ArrayList<ObjectItem>();
    other_datas.addAll(datas);
    System.out.println("memory addrs for obj1:" + other_datas.get(0));//memory addrs for obj1: 533e846f
}

如果您想解决问题,请制作深层复制数据。例如:

public class ObjectItem {

public ObjectItem(ObjectItem other) {
    this.id = other.getId();
}

private int id;

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

}

然后使用它

List<ObjectItem> new_datas = new ArrayList<ObjectItem>();
for (int i = 0; i < datas.size(); i++) {
    new_datas.add(new ObjectItem(datas.get(i)));
}