你可以使用for-each循环来遍历列表中的每一个元素。用法和数组是一样的,如下所示。

import java.util.*;  // import all classes in this package.
public class Test
{
    public static void main(String[] args)
    {
        List<Integer> myList = new ArrayList<Integer>();
        myList.add(50);
        myList.add(30);
        myList.add(20);
        int total = 0;
        for (Integer value: myList)
        {
            total = total + value;
        }
        System.out.println(total);
    }
}

注意以上代码采用的并不是面向对象模式,因为所有的工作都是在main method中完成的。对于面向对象的程序,列表应该是当前object的一个field,工作也应该是在object method中完成而非像main method这样的class/static method。

同理,也可以对列表使用whilefor循环。记住你可以用get(index)来获取索引处的值,用remove(index)来删除索引对应的元素。不过如果在循环过程中删除了元素,后续元素都会左移一位,因而要做相应的处理避免遗漏。for-each循环中不能对列表本身有任何修改,但可以操作列表元素object。

import java.util.*;  // import all classes in this package.
public class ListWorker
{
   private List<String> nameList;

   public ListWorker(List<String> theNames)
   {
       nameList = theNames;
   }

   public boolean removeName(String name)
   {
       boolean found = false;
       int index = 0;
       while (index < nameList.size())
       {
           if (name.equals(nameList.get(index)))
           {
               nameList.remove(index);
               found = true;
           }
           else index++;
       }
       return found;
    }

    public static void main(String[] args)
    {
        List<String> myList = new ArrayList<String>();
        myList.add("Amun");
        myList.add("Ethan");
        myList.add("Donnie");
        myList.add("Ethan");
        ListWorker listWorker = new ListWorker(myList);
        System.out.println(listWorker.nameList);
        listWorker.removeName("Ethan");
        System.out.println(listWorker.nameList);
    }
}

以上的例子中,仅在不删除元素时才将索引后移。如果在所有情况下都后移索引,则会漏过删除元素后紧接着的元素。

你能否修改以上代码,让它仅删除找到的第一个名字?做什么修改能让它删除找到的最后一个名字呢?



0:00

Assume that nums has been created as an ArrayList object and it initially contains the following Integer values [0, 0, 4, 2, 5, 0, 3, 0]. What will nums contain as a result of executing numQuest?

List<Integer> list1 = new ArrayList<Integer>();
private List<Integer> nums;

// precondition: nums.size() > 0;
// nums contains Integer objects
public void numQuest()
{
   int k = 0;
   Integer zero = new Integer(0);
   while (k < nums.size())
   {
      if (nums.get(k).equals(zero))
         nums.remove(k);
      k++;
   }
}
method会删除找到的0,但漏过了对删除元素之后元素的检查。
1

Which of the following is a reason to use a list (assume an object of the class ArrayList) instead of an array?

列表可以动态调整自身所占用的内存大小。
4


陈 欣

AADPS创始人

发表评论