Looping with the For-Each LoopΒΆ

You will often loop through all of the elements of an array (to get the average or to get each one to display). You will typically do this using a for-each loop. A for-each loop is a loop that can only be used on a collection of items. It will loop through the collection and each time through the loop it will use the next item from the collection. It starts with the first item in the array (the one at index 0) and continues through in order to the last item in the array.

1
2
3
4
5
6
7
8
9
public static double getAvg(int[ ] values)
{
   double total = 0;
   for (int val : values)
   {
      total = total + val;
   }
   return total / values.length;
}

The for-each loop is shown on line 4 above. It says to loop through the array called values and each time through the loop set the variable val to the next item in the array. We have to specify the type of val first since this declares a variable. The type must match the type of objects in the array.

The code above wasn’t object-oriented. You may have noticed that it was declared to be static. This means that it is a class method not an object method. It is a class method since it doesn’t operate on any object fields - all data that it needs has been passed in to the method. Class methods can be called using ClassName.methodName(). They can also be called on an object of the class. Object methods can only be called on an object of the class.

A more object-oriented way of doing this would be if the array was a field called values in the same class as the getAverage method. Then you don’t need to pass the array values to the method and the method is an object (instance) method since it operates on the fields of the object.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
private int[ ] values;

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

Since values is an object field and the method getAverage is in the same class it can directly access the field values. The code could have also been written as this.values to indicate the current object’s field called values. Every object method is passed the object the method was called on and it can be referenced using the Java keyword this.

Mixed up programs

7-2-1: The following method has the correct code to return the largest value in an integer array called vals (a field of the current object), but the code is mixed up. Drag the blocks from the left into the correct order on the right. You will be told if any of the blocks are in the wrong order or not indented correctly.



Some examples of finding the largest value in an array start by setting the largest variable to 0. But, what happens if the array only contains negative numbers? What value could you set largest to and still have it work correctly even if the field values contained only negative numbers?

7-2-2: Given that a is an array of integers, 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;





7-2-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;
 }





7-2-4: 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 zero and that a is an array of ints.

for ( int k = 0; k < a.length; k++ )
{
   while ( a[ k ] < temp )
   {
      a[ k ] *= 2;
   }
}