循环遍历数组的所有元素(以求得平均值或在屏幕上显示每个元素)会是你时常遇到的编程任务。通常你会使用for-each循环来实现这一目的。for-each循环是专门用于元素集合(collection)的循环,每一轮会获取集合的一个元素。对数组而言,for-each从第一个元素开始(索引为0)并按顺序遍历到最后一个元素(索引为length - 1)。可以尝试跟踪以下代码的运行过程。

public class Test1
{
   public static double getAvg(int[] values)
   {
     double total = 0;
     for (int val : values)
     {
       total  = total + val;
     }
     return total / values.length;
   }

   public static void main(String[] args)
   {
     int[ ] values = {2, 6, 7, 12, 5};
     System.out.println(getAvg(values));
   }
}

代码的第6行展示了for-each的使用。这里代码循环遍历名为values的数组,每一轮将变量val的值设为数组的下一个元素。我们需要先明确val的类型(也在此声明了该变量),这个类型要与数组的元素类型一致。

以上的代码并非面向对象的。两个方法都是static,意味着它们是class method而非object methodclass method并不对任何object field进行操作——它的数据要从参数传入或来自同样static的field。class method可以以ClassName.methodName()的方式调用,也可以在object上调用。相对而言object method就只能在object上调用了。

要以更面向对象的方式完成这个任务,要把values数组作为class的一个field。这样就不需把数组作为参数传递给method,因为method能直接操作object(实例)内部的数据。通常会用如下所示用构造函数来初始化field。

public class ArrayWorker
{
   private int[ ] values;

   public ArrayWorker(int[] theValues)
   {
      values = theValues;
   }

   public double getAverage()
   {
     double total = 0;
     for (int val : values)
     {
       total  = total + val;
     }
     return total / values.length;
   }

   public static void main(String[] args)
   {
     int[] numArray =  {2, 6, 7, 12, 5};
     ArrayWorker aWorker = new ArrayWorker(numArray);
     System.out.println(aWorker.getAverage());
   }
}

注意此时我们在main method中需要创建一个class的object,这样才能运行object method。注意在getValues中,作为field的values还可以写作this.values。如果field和method自身的参数重名,使用this即可将两者区分开来。

public class ArrayWorker
{
   private int[ ] values;

   public ArrayWorker(int[] theValues)
   {
      values = theValues;
   }

   public double getAverage()
   {
     double total = 0;
     for (int val : values)
     {
       total  = total + val;
     }
     return total / values.length;
   }
   
   public int getLargest()
   {
  
     int largest = values[0];

     for (int item : values)
     {

       if (item > largest)
       {

         largest = item;

       }  // end if 

     } // end for
     return largest;

   } // end method

   public static void main(String[] args)
   {
     int[] numArray =  {2, 6, 7, 12, 5};
     ArrayWorker aWorker = new ArrayWorker(numArray);
     System.out.println(aWorker.getLargest());
   }
}

以上代码展示了如何找到数组中的最大值。有人会把largest初始化为0,但如果数组中只有负数的话会发生什么呢?哪几种对largest的初始化方案可以得到预期的结果?



0:00

Given that a is an array of integers and val is an integer value, which of the following best describes the conditions under which the following code segment will return true?

boolean temp = false;
for ( int i = 0; i < a.length; i++)
{
  temp = ( a[i] == val );
}
return temp;
temp值在循环的过程中会不断被覆盖,最终返回的是对数组末尾元素的比较。
3

Given the following field and method, which of the following best describes the contents of myStuff after (int m = mystery(n);) has been executed?

// private field in the class
private int[ ] myStuff;

//precondition: myStuff contains
//  integers in no particular order
public int mystery(int num)
{
   for (int k = myStuff.length - 1; k >= 0; k--)
   {
       if (myStuff[k] < num)
       {
          return k;
       }
   }

   return -1;
 }
在索引大于m时,所有对应的数组元素都比n小,只有这样循环才能进行。
1

Given the following code segment, which of the following will cause an infinite loop? Assume that temp is an int variable initialized to be greater than 0 and that a is an array of integers.

for ( int k = 0; k < a.length; k++ )
{
   while ( a[k] < temp )
   {
      a[k] *= 2;
   }
}
a为负数时a[k] *= 2永远小于0
2


陈 欣

AADPS创始人

发表评论