Java如何从一个ArrayList中删除一个对象,同时将其添加到另一个?

时间:2015-05-20 14:16:54

标签: java

这是我第一次在这个网站上询问,并明天参加我的考试,所以试着让我的代码变得更好!我将链接整个班级(即使其他3个班级)。

这是方法,我无法从lagerplass删除对象,将其添加到hk.addVarer作品中。所有这一切背后的想法是lagerplass是商品存储在商店(butikk),所以当人们从商店购买商品并将其放入handlekurv时,商品会从商店中删除(lagerplass):

public void leggTilHandlekurv(String varenavn)
    {
        for (Varer a : lagerplass)
        {
            if (a.getVarenavn().equals(varenavn))
            {
                hk.addVarer(a);
                lagerplass.remove(varenavn);
            }
        }
    }

这是整个Butikk课程的代码

public class Butikk
{
// instance variables - replace the example below with your own
public ArrayList<Varer> lagerplass;
Handlekurv hk = new Handlekurv();

/**
 * Constructor for objects of class Butikk
 */
public Butikk()
{
    // initialise instance variables
    lagerplass = new ArrayList<Varer>();
}

/**
 * An example of a method - replace this comment with your own
 * 
 * @param  y   a sample parameter for a method
 * @return     the sum of x and y 
 */
public void nyHeadset(String lyd, String vare,int pris, String varenavn )
{
    // put your code here
    Headset nyHeadset = new Headset ( lyd, vare, pris, varenavn);
    lagerplass.add(nyHeadset);

}

public void nyMus(String vare, int pris, String varenavn, int dpi)
{
    Mus nyMus = new Mus(vare, pris, varenavn, dpi);
    lagerplass.add(nyMus);
}

public void printLagerplass()
{
    for (Varer vare : lagerplass)
    {
        vare.printDetails();
    }
}

public int lagerplassSize()
{
    return lagerplass.size();
}

public void fjernHeleLagerplass()
{
    lagerplass.clear();
}

public void leggTilHandlekurv(String varenavn) 
{ 
Iterator<Varer> iterator = lagerplass.iterator();
while(iterator.hasNext()) {
     Varer a = iterator.next();
     if (a.getVarenavn().equals(varenavn)) {
         iterator.remove();
         hk.addVarer(a);
     }
}

}

public void printHeleHandlekurven()
{
    hk.printHandlekurv();
}

}在此处输入代码

这是整个Varer类的kode

在这里输入代码     公共阶层Varer     {     //代表工作者merke og pris til en vare。     私人String vare;     私人String merke;     私人监狱;     private String varenavn;

/**
 * Constructor for klassen Varer
 */
public Varer(int pris, String varenavn, String vare)
{
    merke = "Razor";
    this.pris = pris;
    this.varenavn = varenavn;
    this.vare = vare;

}

public String getMerke()
{
    return merke;
}

public int getPris() 
{
    return pris;
}

public String getVarenavn()
{
    return varenavn;
}

public String getVare()
{
    return vare;
}

public String getDetails()
{
    return vare + ", " + merke +" " + varenavn + ", "+pris + " kr.";
}
public void printDetails()
{
    System.out.println(vare + ", " + merke +" "+ varenavn + ", "+pris + " kr.");
    System.out.println();
}

3 个答案:

答案 0 :(得分:3)

在迭代它时从集合中删除一个项应该产生ConcurrentModificationException,我认为这是你得到的,这就是你无法从中删除的原因。

要在迭代集合时删除元素,您需要获取该集合的迭代器并通过集合的迭代器将其删除。

public void leggTilHandlekurv(String varenavn) { 
    Iterator<Varer> iterator = lagerplass.iterator();
    while(iterator.hasNext()) {
         Varer a = iterator.next();
         if (a.getVarenavn().equals(varenavn)) {
             iterator.remove();
             hk.addVarer(a);
         }
    }
}

答案 1 :(得分:0)

Iterator.remove是在迭代期间修改集合的唯一安全方法; 如果在迭代进行过程中以任何其他方式修改基础集合,则行为未指定。

for (Iterator<Varer> iterator = lagerplass.iterator(); iterator.hasNext();) {
    Varer a = iterator.next();
    if (a.getVarenavn().equals(varenavn))
    {
        hk.addVarer(a);
        // Remove the current element from the iterator and the list.
        iterator.remove();
    }
}

来源:

http://docs.oracle.com/javase/tutorial/collections/interfaces/collection.html

答案 2 :(得分:0)

这是因为在迭代时不能修改集合。使用带有indeces的for循环或集合上的Iterator并调用remove方法。