如何从java中的linkedlist中删除数据

时间:2012-10-27 11:13:37

标签: java android singly-linked-list

我正在Android中创建一个演示购物车,我正在使用Application类来保存数据。我无法从链接列表中删除数据。我正在为android活动调用removeItem()函数从列表中删除所选项目,但它不起作用任何人都可以帮助我。

    package in.co.santoshsharma.bookshopping;

import java.util.LinkedList;

import android.app.Application;
import android.content.res.Configuration;

public class GlobalData extends Application{
    private String email;
    private String itemName;
    private int itemQuantity;
    private int itemCost;

    public GlobalData(){

    }
    public  GlobalData(String iName,int iQunt,int iCost) {
        // TODO Auto-generated constructor stub
        this.itemCost=iCost;
        this.itemName=iName;
        this.itemQuantity=iQunt;

    }




    public void setEmail(String mail)
    {
        this.email=mail;
    }

    public String getEmail()
    {
        return email;
    }
    public String getItemName()
    {
        return itemName;
    }

    public int getItemCost()
    {
        return itemCost;
    }

    public int getItemQunt()
    {
        return itemQuantity;
    }



    LinkedList<GlobalData> list = new LinkedList<GlobalData>();

    public void setList(String iName,int iQunt,int iCost)
    {
        list.add(new GlobalData( iName, iQunt, iCost));
    }

    public LinkedList<GlobalData> getList()
    {
        return list;
    }
    public void removeItem(String iName,int iQunt,int iCost)
    {
        for(GlobalData data:list)
        {
            if(data.getItemName().equals(iName))
            {
                list.remove(itemName);
                //list.remove(iCost);
                //list.remove(iQunt);
            }
        }
    } 



}

5 个答案:

答案 0 :(得分:1)

首先,覆盖equals()方法并使用itemName属性进行比较

@Override
public boolean equals(Object o) {
  if (o == null) return false;
  if (itemName == null) return false;
  if (o instanceOf String) return itemName.equals(o);
  else if (o instanceOf GlobalData) return ((GlobalData) o).itemName.equals(this.itemName);
  else return false;
}

然后,更改您的removeItem()方法

public void removeItem(String iName) {
  list.remove(iName);
  // or uncomment line below to completely remove all matching elements
  // for (;;list.remove(iName)) {}
}

根据remove() LinkedList方法equals()将调用所提供的Object的{​​{1}}方法,并将其与列表中的每个元素进行比较。

希望这会有所帮助:)

答案 1 :(得分:0)

在迭代它们时,您无法在列表中操作(添加,删除...项目)。你必须使用Iterator

for(Iterator<EmpDedup> iter = list.iterator(); iter.hasNext();) {
    EmpDedup data = iter.next();
    if (data.getRecord() == rec1) {
        iter.remove();
    }
}

请参阅http://docs.oracle.com/javase/6/docs/api/java/util/Iterator.html

来自https://stackoverflow.com/a/10735435/1602230

答案 2 :(得分:0)

您不能使用for-each循环修改Collection。使用简单的for循环或while

  

for-each循环隐藏迭代器,因此您无法调用remove。   因此,for-each循环不可用于过滤。同样的   不适用于需要替换列表中元素的循环   或遍历它时的数组。

来源:http://docs.oracle.com/javase/1.5.0/docs/guide/language/foreach.html

通常,存储list类型元素的名为E的集合以下列方式使用迭代器:

Iterator<E> iterator = list.iterator();
while(iterator.hasNext()) {
    <do something with iterator.next()>;
}

答案 3 :(得分:0)

使用迭代器删除元素:

public void removeItem(String iName, int iQunt, int iCost) {
  Iterator<GlobalData> iterator = list.iterator();
  while (iterator.hasNext()) {
    GlobalData data = iterator.next();
    if (data.getItemName().equals(iName)) {
      iterator.remove();
    }
  }
}

答案 4 :(得分:0)

- 您正在同时访问和修改Collection,这不能直接从For-Each循环完成..

- 使用Iterator解决此问题。

LinkedList<GlobalData> q1 = new LinkedList<GlobalData>();

Iterator<GlobalData> iterator = q1.iterator();

while (iterator.hasNext()){

         GlobalData mp = iterator.next();

         if (mp.name.equals("xyz")){

             iterator.remove();    // You can do the modification here.
         }


 }