0

我正在尝试使用 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

4 回答 4

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
  }
}
于 2013-03-09T09:30:58.987 回答
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);
        }
    }
于 2013-03-09T09:38:01.573 回答
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);
于 2013-03-09T09:43:22.653 回答
0

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

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

迭代器中也存在缺点。如果两个线程同时访问同一个列表对象,它就不起作用。前任。一个线程正在读取,另一个线程正在从列表中删除元素,然后它会抛出java.util.ConcurrentModificationException.Better to use Vectorin concurrent 场景。

如果您仍想使用相同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.
  }
}
于 2013-03-09T10:55:48.460 回答