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 条评论