0

このために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);
            }
        }
    } 



}
4

5 に答える 5

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)) {}
}

http://docs.oracle.com/javase/6/docs/api/java/util/LinkedList.html#remove(java.lang.Object) によると、のメソッドは、提供されたメソッドをremove()呼び出しLinkedList、それをと比較します。リスト内のすべての要素。equals()Object

お役に立てれば :)

于 2012-10-27T12:59:02.913 に答える
0

リストを反復処理している間は、リストを操作(追加、削除...アイテム)することはできません。イテレータを使用する必要があります

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から参照

于 2012-10-27T11:17:45.330 に答える
0

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()>;
}
于 2012-10-27T12:03:31.577 に答える
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();
    }
  }
}
于 2012-10-27T12:12:15.353 に答える
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.
         }


 }
于 2012-10-27T12:14:08.360 に答える