【问题标题】:Java how to remove an object from one ArrayList while adding it to another?Java如何从一个ArrayList中删除一个对象,同时将它添加到另一个?
【发布时间】:2015-05-20 14:16:53
【问题描述】:

这是我第一次在这个网站上提问,明天就要考试了,所以努力让我的代码变得更好!我将链接整个班级(即使是其他 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 类的代码

在此处输入代码 公共课 Varer { // Representerer merke og pris til en vare. 私有字符串变量; 私有字符串merke; 私有int pris; 私有字符串 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();
}

【问题讨论】:

  • 查看解决您问题某个方面的答案:stackoverflow.com/questions/223918/…。您还需要注意您正在尝试从 Varer 集合中删除字符串。
  • 完整答案请提供两个Collection和Varer类的声明。
  • 仅供参考,从ArrayList 中删除(除非您删除最后一项)永远不会看起来很棒。 (使用英语以外的任何其他语言也不是什么好看的东西。)

标签: java


【解决方案1】:

在迭代集合时从集合中删除一个项目应该会产生一个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);
         }
    }
}

【讨论】:

  • 我对 ConcurrentModificationException 投了赞成票,但他也可能在尝试从 Varer 集合中删除字符串时遇到问题,这取决于他是否/如何覆盖 Varer 中的 .equals()。
  • @pens-fan-69:根据 Javadoc,remove 删除了迭代器返回的最后一个元素。它似乎没有使用equals。如果这不是你的意思,请告诉我。
  • 我试过这个并且它删除了,但它不允许我使用我的打印方法,然后我得到一个错误:java.lang.IndexOutOfBoundsException: Index: 1, Size: 1 at java.util.ArrayList .rangeCheck(ArrayList.java:635) at java.util.ArrayList.remove(ArrayList.java:474) at Butikk.leggTilHandlekurv(Butikk.java:69)
  • @KennethRønning:我不知道您的 print 方法是做什么的,所以我只能推测,但您似乎在一些大小为 1 的 ArrayList 上使用了 .get(1)ArrayLists 是基于 Java 的 0)。
  • public void printLagerplass() { for (Varer vare : lagerplass) { vare.printDetails(); } }
【解决方案2】:

这是因为您无法在迭代集合时对其进行修改。要么使用带有 indeces 的 for 循环,要么在你的集合上使用 Iterator 并调用 remove 方法。

【讨论】:

    【解决方案3】:

    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

    【讨论】:

    • 他不是遍历字符串而是遍历 Varer。
    猜你喜欢
    • 1970-01-01
    • 2021-03-15
    • 2017-05-07
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    • 2021-05-15
    • 2013-05-19
    • 1970-01-01
    相关资源
    最近更新 更多