Arrays and Methods




"They have computers, and they may have other weapons of mass destruction."
        -- Janet Reno




As with other reference types, arrays can be:





Arrays as Arguments


Example
:
public class changeArray
{
    public static void oops(int[] a)
    {
       int n = a.length; // notice that this is NOT a method call!
       int zero = a[0];
       a[0] = a[n-1];
       a[n-1] = zero;
    } // what does this method do??

    public static void main(String[] args)
    {
       int[] myArray = {1, 2, 3, 4};
       oops(myArray);
       for(int i = 0; i < myArray.length; i++)
          System.out.println(myArray[i]);
    }
}





Output:
4
2
3
1



Exercise:
Write a program that contains a method that takes an array of doubles, and returns the sum of the array's elements. Test this method in your program's main method.



Exercise: Write a method that takes as its arguments an array of integers, and an integer value, and returns the index of the first occurrence of that integer value in the array. If the integer does not occur in the array, return -1.


Exercise: Write a swap() method that takes an array of integers, and two integer indexes i and j, and swaps the position of the array entries at index i and j. If one or both indices (i and j) are invalid, the method should do nothing.


Exercise: Write a program that reads 10 integers from the keyboard and stores them in an array. Write a method called reverse that reverses the order of the elements in the array. In the main method, print the array, call reverse, and then print the array again.




Arrays as Return Values



Example:

public class genArray
{
    public static int[ ] fillArray(int size)
    {
          // Creates array containing integers 1 to size
          int[ ] result = new int[size];

          for(int i = 0; i < size; i++)
          {
             result[i] = i+1;
          }
          return result;
    }

    public static void main(String[] args)
    {
       int[ ] a = fillArray(5);
       for(int i = 0; i < a.length; i++)
          System.out.println(a[i]);
    }
}


Output:
1
2
3
4
5



Exercise: Write a program that includes a method that takes 2 integers and creates and returns an array that contains all the integer values between them. That is, if the integers passed to the method are -1 and 7, the method should return an array that contains -1, 0, 1, 2, 3, 4, 5, 6, 7. In your main method, call this method to create several arrays and then print them.



Useful Methods for Arrays



java.lang.System methods

static void arraycopy(Object from, int fromIndex, Object to, int toIndex, int count)




java.util.Arrays methods

sort(Type[ ] a)
    sorts an array of type int, long, short, char, byte, boolean, float or double into ascending order

binarySearch(Type[ ] a, Type v)
    a is a sorted array of type int, long, short, char, byte, boolean, float or double.  
    The binary search algorithm is used to search for value v. If v is in a, then v's index is returned; otherwise a negative value is returned.

equals(Type[ ] a, Object other)
    a is an array of type int, long, short, char, byte, boolean, float or double.
    This method returns true if other is an array of the same type and size, and the elements in corresponding positions match. It returns false otherwise.

fill(Type[] a, Type value)
    Sets every entry in a to value.

toString(Type[] a)
    returns a nice String representation of array a, e.g., [1, 2, 3]

copyOf(Type[] a, int newSize)
    returns a copy of array a with the given size





Exercise: Write a program that reads 15 floating point numbers from the keyboard, and stores these numbers in an array. Print a message indicating the largest array element and the smallest array element.





Searching Arrays



Search Algorithms
Searching - locating a particular value (the key) in an array



Linear Search


public int linearSearch(int[ ] theArray, int key)
{
    for(int i = 0; i < array.length; i++)
       if(array[i] = = key) return i;
    return -1;
}


Algorithm Analysis:
If the array elements are unsorted, then on average the linear search algorithm will compare the key to half the array elements.

So for an array of size n, linear search does n/2 comparisons in the average case.



Binary Search


Example
:
Search for key = 40 in array containing 2, 5, 7, 10, 15, 31, 40, 55



public int binarySearch(int[ ] array, int key)
{
    int low = 0, high = array.length - 1;

    while(low <= high) // Search elements in positions low to high
    {
       int mid = (low + high)/2; // index of the middle element
       if(array[mid] = = key)  // compare middle element in the search range to the key
            return mid;
       else if(array[mid] < key)  // Search top half
            low = mid + 1;
       else // Search bottom half
            high = mid - 1;
    }
    return -1;
}






Exercise: When binary search is carried out on array
[3, 8, 10, 30, 35, 37, 40, 45, 50, 58] and key = 10, how many array elements are compared to the key?

A. 1
B. 2
C. 3
D. 4
E. 5



Methods and Arrays

Recall: When you pass an array or other object to a method, you are actually passing the address of that object. So the method can modify the object.


Example: Write a method makeArray() that takes an integer n (as its parameter), and creates and returns an array that contains the integers 0, 1, ..., |n|-1.  Then write a main() method that reads an integer k from the user, calls makeArray(k), and prints the array that is returned.

public static int[] makeArray(int n) {
    int size = Math.abs(n);
    // finish the method...



}

public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    System.out.print("Array size? ");
    int cap = scan.nextInt();

    int[] newArray = makeArray(cap);
    for(int j = 0; j < newArray.length; j++)
        System.out.println(newArray[j]);
}



Exercise: Write a method that takes an array of integers, and increments the first and last elements of the array. Write a main method that calls this method, printing the array after the method call.



Questions: Consider the following program:
import java.util.*;
public class Ref {
    public static void changePrim(int n, int m) {
       int temp = n;
       n = m;
       m = temp;
    }

    public static void changeRef(int[] arr) {
       int temp = arr[0];
       arr[0] = arr[arr.length-1];
       arr[arr.length-1] = temp;
    }

    public static void main(String[] args) {
       int n = 4;
       int m = 5;
       System.out.println("n: " + n + ", m: " + m);
       changePrim(n, m);
       System.out.println("n: " + n + ", m: " + m); // line 1

       int[] a = {1, 2, 3, 4};
       System.out.println(Arrays.toString(a));
       changeRef(a);
       System.out.println("" + Arrays.toString(a)); // line 2
    }
}

1. What is the output from line 1?         2. What is the output from line 2?
A. n: 4, m: 5                                          A. [1, 2, 3, 4]
B. n: 0, m: 0                                          B. [4, 2, 3, 1]
C. n: 5, m: 4                                          C. [4, 3, 2, 1]
                                                             D. [0, 0, 0, 0]



for-each loop

If we only want to examine or display all the elements in an array in order from first to last (e.g., the previous exercise), we can use a different loop construct:


Example: Use an enhanced for loop to print an array's entries.

int[] arr = {1, 2, 3, 4, 5};
for(int value : arr)
     System.out.println(value);


Output:

1
2
3
4
5


Exercise:
Write a method that takes an array of integers and returns the largest array element.

Note: We cannot change array entries in the body of a for-each loop. This does not work as expected:

int[] arr = {1, 2, 3, 4, 5};
for(int value : arr) {
   value++;
}

// arr is unchanged after the for-each loop is executed


Review Questions:

1. What is the output of the following code?

int[] a = {4, 5, 6};
for(int i = 0; i < a.length; i++) {
    a[i]++;
}
System.out.println(a[2]);

A. 4
B. 5
C. 6
D. 7
E. An exception is thrown.


2.

What is the output of the following code?

int[] a = {4, 5, 6};
for(int n : a) {
    n++;
}
System.out.println(a[2]);

A. 4
B. 5
C. 6
D. 7
E. An exception is thrown.


More Array Traversal


If we want to reverse an array, we can either modify the original array so that it is reversed, or produce a new array that is the reverse of the original, leaving the first array unchanged.


Exercise: Write a method that takes an integer array as its argument, and returns the reverse array, leaving the argument unchanged.


Exercise: Write a method shuffle() that takes an integer array as its argument, and modifies the array by shifting all entries one place to the right and moving the last entry to the first position in the array.
int[] a = {2, 3, 4};
shuffle(a); // now a is {4, 2, 3}





The value null


null is a value that can be assigned to a reference variable to indicate that the variable has not been assigned the address of an object.

String str = null;
int[] arr = null;


This use of null allows us to do some error checking: we can write code that checks whether or not the reference variable has been initialized with this type of comparison:
if(str == null)

or

if(arr != null)




Arrays of Objects

To create an array of objects:
1. Create the array's reference variable.
    Ex: Random[] r;
2. Allocate the array of object references.
    r = new Random[3];
3. Allocate memory for each array entry.
    for(int i = 0; i < 3; i++)
        r[i] = new Random();



Example:
Create an array of five String objects. Initialize the array entries to be: "elvis0", "elvis1", ..., "elvis4". Use a for-each loop to print the Strings in the array. Then write a method reverseConcat() that takes your String array as its parameter, and returns a String that contains the concatenation of all the Strings in reverse order, e.g., "elvis4elvis3elvis2elvis1" is returned for the array in our example.