从ArrayList中删除元素

时间:2013-03-09 09:25:39

标签: java loops for-loop arraylist

我正在尝试使用ArrayList和for循环删除字符串匹配“Meg”。到目前为止,我已经编写了下面的代码,不知道为什么它不起作用。我认为问题出在下面while循环

while((customerName.get(i)).equals("Meg"))
{
  customerName.remove(i);
}

提前致谢。

完整代码如下:

import java.util.ArrayList;
public class CustomerLister2
{
  public static void main(String[] args)
  {
    ArrayList<String> customerName = new ArrayList<String>(); 
    customerName.add("Chris");
    customerName.add("Lois");
    customerName.add("Meg");
    customerName.add("Peter");
    customerName.add("Stewie");
    customerName.add(3, "Meg");
    customerName.add(4, "Brian");

    int currentSize = customerName.size();

    for(int i = 0; i < currentSize - 1; i++)
    {

      while((customerName.get(i)).equals("Meg"))
      {
        customerName.remove(i);
      }
    }
    for(String newStr: customerName)
    {
      System.out.println(newStr);
    }
  }
}

4 个答案:

答案 0 :(得分:2)

将其更改为以下

for(int i = 0; i < currentSize; i++)
{
  if((customerName.get(i)).equals("Meg"))
  {
    customerName.remove(i);
    i--;  //because a new element may be at i now
    currentSize = customerName.size(); //size has changed
  }
}

答案 1 :(得分:1)

或者,如果您不必使用for循环:

   public static void main(String[] args) {

        ArrayList<String> customerName = new ArrayList<String>();
        customerName.add("Chris");
        customerName.add("Lois");
        customerName.add("Meg");
        customerName.add("Peter");
        customerName.add("Stewie");
        customerName.add(3, "Meg");
        customerName.add(4, "Brian");

        while (customerName.remove("Meg")) {}

        for (String s : customerName) {
            System.out.println(s);
        }
    }

答案 2 :(得分:0)

这会对你有所帮助

System.out.println("Customer Name (including Meg)"+customerName);
for(int i=0; i<customerName.size(); i++)
{
  String s = customerName.get(i);
  if(s.equals("Meg"))
  {
     customerName.remove(i);
     i--;
  }
}
System.out.println("Customer Name (excluding Meg)"+customerName);

答案 3 :(得分:0)

使用iterator customerName.iterator()(iterator()是非静态方法) 迭代器负责列表的计数修改。当我们使用for循环时,我们可能忘记处理列表的计数修改。

Iterator<String> itr= customerName.iterator();
while(itr.hasNext())
{
    if(itr.next().equals("Meg")){
        itr.remove();
    }
}

在迭代器中还有缺点。如果两个线程同时访问同一个列表对象,它就不起作用。防爆。一个线程正在读取,另一个线程正在从列表中删除元素,然后它会抛出java.util.ConcurrentModificationException.更好地在并发场景中使用Vector

如果您仍想使用相同的for循环,请添加以下代码行。

int currentSize = customerName.size();

for(int i = 0; i < currentSize; i++)
{

  while((customerName.get(i)).equals("Meg"))
  {
    customerName.remove(i);
    currentSize = customerName.size(); //add this line to avoid run-time exception.
  }
}