AP计算机教程6-2:使用for-each循环
循环遍历数组的所有元素(以求得平均值或在屏幕上显示每个元素)会是你时常遇到的编程任务。通常你会使用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 method。class 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值在循环的过程中会不断被覆盖,最终返回的是对数组末尾元素的比较。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小,只有这样循环才能进行。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。
0 条评论