Chapter4 Arrays
Chapter4 Arrays
2
Why the problem is hard
• We need each input value twice:
– to compute the average (a cumulative sum)
– to count how many were above average
3
Arrays
• array: object that stores many values of the same type.
– element: One value in an array.
– index: A 0-based integer to access an element from an array.
index 0 1 2 3 4 5 6 7 8 9
value 12 49 -2 26 5 17 -6 84 72 3
4
Array declaration
type[] name = new type[length];
– Example:
int[] numbers = new int[10];
index 0 1 2 3 4 5 6 7 8 9
value 0 0 0 0 0 0 0 0 0 0
5
Array declaration, cont.
• The length can be any integer expression.
int x = 2 * 3 + 1;
int[] data = new int[x % 5 + 2];
6
Accessing elements
name[index] // access
name[index] = value; // modify
– Example:
numbers[0] = 27;
numbers[3] = -6;
System.out.println(numbers[0]);
if (numbers[3] < 0) {
System.out.println("Element 3 is negative.");
}
index 0 1 2 3 4 5 6 7 8 9
value 27
0 0 0 -6
0 0 0 0 0 0 0
7
Arrays of other types
double[] results = new double[5];
results[2] = 3.4;
results[4] = -0.5;
index 0 1 2 3 4
value 0.0 0.0 3.4 0.0 -0.5
8
Out-of-bounds
• Legal indexes: between 0 and the array's length - 1.
– Reading or writing any index outside this range will throw an
ArrayIndexOutOfBoundsException.
• Example:
int[] data = new int[10];
System.out.println(data[0]); // okay
System.out.println(data[9]); // okay
System.out.println(data[-1]); // exception
System.out.println(data[10]); // exception
index 0 1 2 3 4 5 6 7 8 9
value 0 0 0 0 0 0 0 0 0 0
9
Accessing array elements
int[] numbers = new int[8];
numbers[1] = 3;
numbers[4] = 99;
numbers[6] = 2;
int x = numbers[1];
numbers[x] = 42;
numbers[numbers[6]] = 11; // use numbers[6] as index
x 3
index 0 1 2 3 4 5 6 7
numbers value 0 4 11 42 99 0 2 0
10
Arrays and for loops
• It is common to use for loops to access array elements.
for (int i = 0; i < 8; i++) {
System.out.print(numbers[i] + " ");
}
System.out.println(); // output: 0 4 11 0 44 0 0 2
11
The length field
• An array's length field stores its number of elements.
name.length
13
Weather answer
// Reads temperatures from the user, computes average and # days above average.
import java.util.*;
public class Weather {
public static void main(String[] args) {
Scanner console = new Scanner(System.in);
System.out.print("How many days' temperatures? ");
int days = console.nextInt();
int[] temps = new int[days]; // array to store days' temperatures
int sum = 0;
for (int i = 0; i < days; i++) { // read/store each day's temperature
System.out.print("Day " + (i + 1) + "'s high temp: ");
temps[i] = console.nextInt();
sum += temps[i];
}
double average = (double) sum / days;
int count = 0; // see if each day is above average
for (int i = 0; i < days; i++) {
if (temps[i] > average) {
count++;
}
}
// report results
System.out.printf("Average temp = %.1f\n", average);
System.out.println(count + " days above average");
}
}
14
Quick array initialization
type[] name = {value, value, … value};
– Example:
int[] numbers = {12, 49, -2, 26, 5, 17, -6};
index 0 1 2 3 4 5 6
value 12 49 -2 26 5 17 -6
15
Limitations of arrays
• You cannot resize an existing array:
int[] a = new int[4];
a.length = 10; // error
16
The Arrays class
• Class Arrays in package java.util has useful static
methods for manipulating arrays:
Method name Description
binarySearch(array, value) returns the index of the given value in a sorted
array (or < 0 if not found)
copyOf(array, length) returns a new copy of an array
equals(array1, array2) returns true if the two arrays contain same
elements in the same order
fill(array, value) sets every element to the given value
sort(array) arranges the elements into sorted order
toString(array) returns a string representing the array, such as
"[10, 30, -25, 17]"
• Syntax: Arrays.methodName(parameters)
17
Arrays.toString
• Arrays.toString accepts an array as a parameter and
returns a String representation of its elements.
Output:
e is [0, 14, 4, 6, 8]
18
Weather question 2
• Modify the weather program to print the following output:
How many days' temperatures? 7
Day 1's high temp: 45
Day 2's high temp: 44
Day 3's high temp: 39
Day 4's high temp: 48
Day 5's high temp: 37
Day 6's high temp: 46
Day 7's high temp: 53
Average temp = 44.6
4 days were above average.
19
Weather answer 2
// Reads temperatures from the user, computes average and # days above average.
import java.util.*;
public class Weather2 {
public static void main(String[] args) {
...
int[] temps = new int[days]; // array to store days' temperatures
... (same as Weather program)
// report results
System.out.printf("Average temp = %.1f\n", average);
System.out.println(count + " days above average");
20
Arrays as parameters
Swapping values
public static void main(String[] args) {
int a = 7;
int b = 35;
// swap a with b?
a = b;
b = a;
System.out.println(a + " " + b);
}
– What is wrong with this code? What is its output?
23
Algorithm idea
• Swap pairs of elements from the edges; work inwards:
index 0 1 2 3 4 5
value 11
89 42
0 27
-5 27
-5 42
0 89
11
24
Flawed algorithm
• What's wrong with this code?
int[] numbers = [11, 42, -5, 27, 0, 89];
// reverse the array
for (int i = 0; i < numbers.length; i++) {
int temp = numbers[i];
numbers[i] = numbers[numbers.length - 1 - i];
numbers[numbers.length - 1 - i] = temp;
}
• The loop goes too far and un-reverses the array! Fixed version:
for (int i = 0; i < numbers.length / 2; i++) {
int temp = numbers[i];
numbers[i] = numbers[numbers.length - 1 - i];
numbers[numbers.length - 1 - i] = temp;
}
25
Array reverse question 2
• Turn your array reversal code into a reverse method.
– Accept the array of integers to reverse as a parameter.
26
Array parameter (declare)
public static type methodName(type[] name) {
• Example:
// Returns the average of the given array of numbers.
public static double average(int[] numbers) {
int sum = 0;
for (int i = 0; i < numbers.length; i++) {
sum += numbers[i];
}
return (double) sum / numbers.length;
}
– You don't specify the array's length (but you can examine it).
27
Array parameter (call)
methodName(arrayName);
• Example:
public class MyProgram {
public static void main(String[] args) {
// figure out the average TA IQ
int[] iq = {126, 84, 149, 167, 95};
double avg = average(iq);
System.out.println("Average IQ = " + avg);
}
...
– Notice that you don't write the [] when passing the array.
28
Array return (declare)
public static type[] methodName(parameters) {
• Example:
// Returns a new array with two copies of each value.
// Example: [1, 4, 0, 7] -> [1, 1, 4, 4, 0, 0, 7, 7]
public static int[] stutter(int[] numbers) {
int[] result = new int[2 * numbers.length];
for (int i = 0; i < numbers.length; i++) {
result[2 * i] = numbers[i];
result[2 * i + 1] = numbers[i];
}
return result;
}
29
Array return (call)
type[] name = methodName(parameters);
• Example:
public class MyProgram {
public static void main(String[] args) {
int[] iq = {126, 84, 149, 167, 95};
int[] stuttered = stutter(iq);
System.out.println(Arrays.toString(stuttered));
}
...
• Output:
[126, 126, 84, 84, 149, 149, 167, 167, 95, 95]
30
Reference semantics
3131
A swap method?
• Does the following swap method work? Why or why not?
public static void main(String[] args) {
int a = 7;
int b = 35;
// swap a with b?
swap(a, b);
System.out.println(a + " " + b);
}
int x = 5;
int y = x; // x = 5, y = 5
y = 17; // x = 5, y = 17
x = 8; // x = 8, y = 17
33
Reference semantics (objects)
• reference semantics: Behavior where variables actually store
the address of an object in memory.
– When one variable is assigned to another, the object is
not copied; both variables refer to the same object.
– Modifying the value of one variable will affect others.
index 0 1 2
a1 value 7
4 15 8 a2
34
References and objects
• Arrays and objects use reference semantics. Why?
– efficiency. Copying large objects slows down a program.
– sharing. It's useful to share an object's data among methods.
panel1
panel2
35
Objects as parameters
• When an object is passed as a parameter, the object is not
copied. The parameter refers to the same object.
– If the parameter is modified, it will affect the original object.
36
Arrays pass by reference
• Arrays are passed as parameters by reference.
– Changes made in the method are also seen by the caller.
public static void main(String[] args) {
int[] iq = {126, 167, 95};
increase(iq);
System.out.println(Arrays.toString(iq));
}
iq
public static void increase(int[] a) {
for (int i = 0; i < a.length; i++) {
a[i] = a[i] * 2;
}
}
index 0 1 2
– Output:
a value 126 334
252 167 190
95
[252, 334, 190]
37
Array reverse question 2
• Turn your array reversal code into a reverse method.
– Accept the array of integers to reverse as a parameter.
• Solution:
public static void reverse(int[] numbers) {
for (int i = 0; i < numbers.length / 2; i++) {
int temp = numbers[i];
numbers[i] = numbers[numbers.length - 1 - i];
numbers[numbers.length - 1 - i] = temp;
}
}
38
Array parameter questions
• Write a method swap that accepts an arrays of integers and
two indexes and swaps the elements at those indexes.
int[] a1 = {12, 34, 56};
swap(a1, 1, 2);
System.out.println(Arrays.toString(a1)); // [12, 56, 34]
39
Array parameter answers
// Swaps the values at the given two indexes.
public static void swap(int[] a, int i, int j) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
40
Array return question
• Write a method merge that accepts two arrays of integers and
returns a new array containing all elements of the first array
followed by all elements of the second.
int[] a1 = {12, 34, 56};
int[] a2 = {7, 8, 9, 10};
int[] a3 = merge(a1, a2);
System.out.println(Arrays.toString(a3));
// [12, 34, 56, 7, 8, 9, 10]
42
Array return answer 2
// Returns a new array containing all elements of a1,a2,a3.
public static int[] merge3(int[] a1, int[] a2, int[] a3) {
int[] a4 = new int[a1.length + a2.length + a3.length];
for (int i = 0; i < a1.length; i++) {
a4[i] = a1[i];
}
for (int i = 0; i < a2.length; i++) {
a4[a1.length + i] = a2[i];
}
for (int i = 0; i < a3.length; i++) {
a4[a1.length + a2.length + i] = a3[i];
}
return a4;
}
43
A multi-counter problem
• Problem: Write a method mostFrequentDigit that returns
the digit value that occurs most frequently in a number.
44
A multi-counter problem
• We could declare 10 counter variables ...
int counter0, counter1, counter2, counter3, counter4,
counter5, counter6, counter7, counter8, counter9;
index 0 1 2 3 4 5 6 7 8 9
value 1 0 2 0 0 0 4 1 0 0
46
solution
// Returns the digit value that occurs most frequently in n.
// Breaks ties by choosing the smaller value.
public static int mostFrequentDigit(int n) {
int[] counts = new int[10];
while (n > 0) {
int digit = n % 10; // pluck off a digit and tally it
counts[digit]++;
n = n / 10;
}
// find the most frequently occurring digit
int bestIndex = 0;
for (int i = 1; i < counts.length; i++) {
if (counts[i] > counts[bestIndex]) {
bestIndex = i;
}
}
return bestIndex;
}
47
Arrays of Arrays
Two-dimensional arrays
• Two-dimensional arrays
– Table of data for each experiment and outcome.
– Table of grades for each student and assignments.
– Table of grayscale values for each pixel in a 2D image.
48
Arrays of Arrays
Two-dimensional arrays
• Two-Dimensional arrays
49
Arrays of Arrays
Two-dimensional arrays
• Array access
– Use a[i][j] to access element in row i and column j.
• Zero-based indexing. Row and column indices start at 0.
50
Arrays of Arrays
Two-dimensional arrays
• Initialize 2D array by listing values.
51
Example: Matrix addition
52
Arrays of Arrays of Varying
Length
• All arrays do not have to be of the same length
float[][] samples;
samples=new float[6][];//defines # of arrays
samples[2]=new float[6];
samples[5]=new float[101];
53
Arrays of Arrays of Varying
Length
• Initializing Varying Size Arrays
int[][] uneven = { { 1, 9, 4 }, { 0, 2}, { 0, 1, 2, 3, 4 } };
//Three arrays
//First array has 3 elements
//Second array has 2 elements
//Third array has 5 elements
• Array of arrays length
long[][] primes = new long[20][];
primes[2] = new long[30];
20 System.out.println(primes.length); //Number of arrays
30 System.out.println(primes[2].length);//Number of elements
in the second array
54
Sample Program
class unevenExample Output
{ Row 0: 1 9 4
public static void main( String[] arg ) Row 1: 0 2
{ // declare and construct a 2D array Row 2: 0 1 2 3 4
int[][] uneven = { { 1, 9, 4 }, { 0, 2}, { 0, 1, 2, 3, 4
} };
// print out the array
for ( int row=0; row < uneven.length; row++ ) //changes
row
{
System.out.print("Row " + row + ": ");
for ( int col=0; col < uneven[row].length; col++ )
//changes column
System.out.print( uneven[row][col] + " ");
System.out.println();
}
}
}
55
Array of arrays
Multidimensional Arrays
• A farmer has
– 10 farms of beans each in 5 countries, and each farm has 30
fields
• Three-dimensional array
long[][][] beans=new long[5][10][30];
//beans[country][farm][fields]
56
Array of arrays
Multidimensional Arrays
• Varying length in Multidimensional Arrays
– Same features apply to multi-dimensional arrays as those of 2
dimensional arrays
57