【问题标题】:how to remove data from linkedlist in java如何从java中的链表中删除数据
【发布时间】:2012-10-17 11:17:23
【问题描述】:

我正在 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);
            }
        }
    } 



}

【问题讨论】:

  • 使用迭代器遍历列表

标签: java android singly-linked-list


【解决方案1】:

您不能使用 for-each 循环修改集合。使用简单的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()>;
}

【讨论】:

    【解决方案2】:

    首先,覆盖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)) {}
    }
    

    根据LinkedListhttp://docs.oracle.com/javase/6/docs/api/java/util/LinkedList.html#remove(java.lang.Object) 方法remove() 将调用提供的Objectequals() 方法并将其与列表中的每个元素进行比较。

    希望这会有所帮助:)

    【讨论】:

      【解决方案3】:

      - 您正在同时访问和修改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.
               }
      
      
       }
      

      【讨论】:

        【解决方案4】:

        使用迭代器移除元素:

        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();
            }
          }
        }
        

        【讨论】:

          【解决方案5】:

          当您对列表进行迭代时,您不能在列表中进行操作(添加、删除...项目)。你必须使用迭代器

          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

          【讨论】:

            猜你喜欢
            • 2017-09-27
            • 2016-07-23
            • 1970-01-01
            • 1970-01-01
            • 2018-09-16
            • 1970-01-01
            • 1970-01-01
            • 2012-05-30
            • 1970-01-01
            相关资源
            最近更新 更多