chapter8

chapter8 - Chapter 8 Arrays Chapter Goals Learn arrays...

Info iconThis preview shows page 1. Sign up to view the full content.

View Full Document Right Arrow Icon
This is the end of the preview. Sign up to access the rest of the document.

Unformatted text preview: Chapter 8 Arrays Chapter Goals Learn arrays ArrayLists will be left out, learn in 367 along with autoboxing Wrapper classes Multidimensional arrays Arrays Common to want to deal with collection of items Keep information about all 302 students Information about all video files on computer All of my grades since kindergarten Books in a library Infeasible to enumerate an identifier for each book1, book2, book3, ...., book500 Arrays Arrays are a sequence of spots to store a certain data type Two components Data Type Size Data Type What type of element do we want to store in our array? Can be a primitive or reference type Syntax: <datatype> <identifier>; <dataype> <identifier>; Arrays Problem: Want to display differences in scores from average We have to keep track of each score We could just create one identifier for all 10 scores (score1, score2...) But what if we wanted to take in more scores? Solution: Use an array of scores to store all scores Arrays double scores; OR double scores; Size To create an array, we must use the new operator Syntax: <identifier> = new <datatype>[<size>]; Examples: scores = new double[10]; double scores = new double[10]; What data type is an array? Memory Diagram scores 0 1 2 3 4 5 6 7 8 9 Arrays Can access an individual item in the collection Use a single identifier for the whole collection (scores) and then use an indexed expression to access an array element Zero based indexing! (just like Strings) Index numbered 0 through <size>-1 Can use expressions like scores[i+1] scores[0] scores[2] //1st element //3rd element Memory Diagram scores 0 1 2 3 4 5 6 7 8 9 scores[2] double scores = new double[10]; double avg, sum = 0; for(int i=0; i < 10; i++){ System.out.print("Enter Score"); scores[i] = in.nextDouble(); sum += scores[i]; } avg = sum/10; for(int i=0; i < 10; i++){ System.out.print("Score " + i + " "); System.out.print(score[i] + " "); System.out.println(score[i] avg); Example Sample Run Enter Enter Enter Enter Enter Enter Enter Enter Enter Enter score: score: score: score: score: score: score: score: score: score: 22 24 90 88 75 95 65 80 92 69 Score Score Score Score Score Score Score Score Score Score 0 1 2 3 4 5 6 7 8 9 22.0 24.0 90.0 88.0 75.0 95.0 65.0 80.0 92.0 69.0 -48.0 -46.0 20.0 18.0 5.0 25.0 -5.0 10.0 22.0 -1.0 Initial Values When array is created, all values are initialized depending on array type: Numbers: 0 Boolean: false Object References: null Means compiler does not force initialization like with primitives Length We assumed size of array was 10...what if we aren't sure? Or want to change size? Every array has a public constant data member named length (no parenthesis) for(int i=0; i < scores.length; i++){ System.out.print("Score "+i+" "); System.out.print(score[i]+" "); System.out.println(score[i] avg); } Example double rainfall = new double[12]; double avg, sum = 0; for(int i=0; i < rainfall.length; i++){ rainfall[i] = getDouble("Enter monthly rainfall for month "+i); sum += rainfall[i]; } avg = sum/12; for(int i=0; i < rainfall.length; i++){ System.out.print("Month "+i+" "); System.out.print(rainfall[i]+" "); System.out.println(rainfall[i] avg); } Modifications What if we want to output specific month? String monthName = new String[12]; monthName[0] = "Jan"; monthName[1] = "Feb"; monthName[2] = "Mar"; monthName[3] = "Apr"; monthName[4] = "May"; monthName[5] = "Jun"; monthName[6] = "Jul"; monthName[7] = "Aug"; monthName[8] = "Sep"; monthName[9] = "Oct"; monthName[10] = "Nov"; monthName[11] = "Dec"; What if we want to output specific month? Can keep array of Strings Example double rainfall = new double[12]; double avg, sum = 0; for(int i=0; i < rainfall.length; i++){ rainfall[i] = getDouble("Enter monthly rainfall for month "+monthName[i]); sum += rainfall[i]; } avg = sum/12; for(int i=0; i < rainfall.length; i++){ System.out.print("Month "+monthName[i]+" "); System.out.print(rainfall[i]+" "); System.out.println(rainfall[i] avg); } Initializing Arrays You can also initialize all values right off the bat instead of individually as before String monthName = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; No need to use new, or specify size Knows size from number of values in list Array Sizes So far, we have used constants to define the size of the array Fixedsize array declaration What about if we aren't sure how many scores we want? Soln 1 declare array of size 100 and get input, quitting once the array is full Array Sizes 2 problems Inefficient wastes space (what if we get 1 score? Wasted space for other 99) underutilization Limiting what if we want more than 100 scores? Solution variable size array nonconstant values for size Note: You still cannot change the size once created (length is constant) Array Sizes int size; double scores; System.out.println("Enter number of scores to enter: "); size = in.nextInt(); scores = new double[size]; Array Sizes Can use any mathematic expression Must give a whole number (integer) Arrays of Objects BankAccount ba; System.out.print("Enter number of accounts: "); int numAccounts = in.nextInt(); ba = new BankAccount[numAccounts]; ba[0].deposit(500); What's wrong? Arrays of Objects We have created the array (i.e. the bins) What's in the bins? We still need to create an object for each bin Memory Diagram ba 0 1 2 3 4 5 6 7 8 9 ... Arrays of Objects Each "bin" (index of the array) is a reference When we declare an array, we declare numAccounts identifiers in essence Now we need to create a BankAccount object for each bin Arrays of Objects BankAccount ba; System.out.print("Enter number of accounts: "); int numAccounts = in.nextInt(); ba = new BankAccount[numAccounts]; ba[0] = new BankAccount(); ba[0].deposit(500); Memory Diagram ba 0 1 2 3 4 5 6 7 8 9 ... :BankAccount balance 500 Arrays of Objects We will use the Person class to illustrate this concept. An array of objects is declared and created just as an array of primitive data types is. Person person; person = new Person[20]; Arrays of Objects An array of Person objects after the array is created. Arrays of Objects The person array with one Person object added to it. Arrays of Objects To assign data values to this object, we can execute person[0].setName ("Ms. Latte"); person[0].setAge (20); person[0].setGender (`F'); The syntax here is the one used to call an object's method; we are using an indexed expression to refer to the object instead of a simple variable. Example The following program illustrates various aspects of array processing: Creating a new Person array. Creating a new Person object and assigning values to it. Finding the average age of the persons in the array. Finding the youngest and oldest persons in the array. Finding a particular person in the array. /* Sample Program: Illustrate the processing of an array of Person objects File: ProcessPersonArray.java */ public class ProcessPersonArray { public static void main (String args) { Person person; //declare the person array person = new Person[5]; //and then create it //----------- Create person Array ------------// String name, inpStr; int age; char gender; for (int i = 0; i < person.length; i++) { //read in data values name = in.nextLine(); age = in.nextInt(); inpStr = in.next().charAt(0); //create a new Person and assign values person[i] = new Person( ); person[i].setName ( person[i].setAge ( person[i].setGender( } name age gender ); ); ); //------ Compute Average Age --------------// float sum = 0, averageAge; for (int i = 0; i < person.length; i++) { sum += person[i].getAge(); } averageAge = sum / (float) person.length; System.out.println("Average age: " + averageAge); //-- Find the youngest and oldest person ------// //-- Approach No. 3: Using person reference ---// Person youngest, //points to the youngest person oldest; //points to the oldest person youngest = oldest = person[0]; for (int i = 1; i < person.length; i++) { if ( person[i].getAge() < youngest.getAge() ) { //found a younger person youngest = person[i]; } else if (person[i].getAge() > oldest.getAge() ) { //found an older person oldest = person[i]; } } System.out.println("Oldest : " + oldest.getName() + " is " + oldest.getAge() + " years old."); System.out.println("Youngest: " + youngest.getName() + " is " + youngest.getAge() + " years old."); Example An array of Person objects with two Person variables. Deleting Objects How do we delete an object? tms[x] = null; Remember garbage collection takes any objects no longer being referenced to (i.e. can never be accessed again) Wrapper Classes Wrapper Classes Allow us to treat primitives as objects Each wrapper class has a primitive data member Wrapper Classes Finding the Average double scores = ... //Get scores from user double avg = 0; for(int i = 0; i < scores.length; i++){ avg += scores[i]; } avg = avg / scores.length; double scores = ...//Get scores from user double avg = 0; for(int i = 0; i < scores.length; i++){ avg += scores[i]; } avg = avg / scores.length; // Count number of scores greater than average int count = 0; for(int i = 0; i < scores.length; i++){ if(scores[i] >= avg){ count++; } } Counting Finding a Value double scores double search = = ...//Get scores ...//Get value to from file search from user boolean found = false; for(int j = 0; j < scores.length; j++) { if(Math.abs(scores[j],search) <= 1E-14) { found = true; } } Maximum/Minimum double max = scores[0]; double min = scores[0]; for(int i = 1; i < scores.length; i++) { if(scores[i] > max) { max = scores[i]; } else if(scores[i] < min) { min = scores[i]; } } Counting Using Objects public class Bank { private BankAccount accounts; public int count(double atLeast) { int matches = 0; for (int j = 0; j < accounts.length; j++) { if (accounts[j].getBalance() >= atLeast) matches++; // Found a match } return matches; } . . . } Searching Using Objects public class Bank { public BankAccount find(int accountNumber) { for (int j = 0; j < accounts.length; j++) { if (accounts[j].getAccountNumber() == accountNumber) // Found a match return accounts[j]; } return null; // No match in the array list } } Maximum Using Objects public BankAccount maximum() { if (accounts.length == 0) return null; BankAccount largestYet = accounts[0]; for (int i = 1; i < accounts.length; i++) { BankAccount a = accounts[i]; if (a.getBalance() > largestYet.getBalance()) largestYet = a; } return largestYet; } MultiDimensional Arrays So far we've seen only onedimensional arrays Many problems may require us to represent data in a "table" format, in two dimensions We use twodimensional arrays in order to do this What do we need to add? 2D Arrays Instead of one index, we need two indices row and column Example: We have multiple students, and each student has multiple scores row for student, column for test int scores; scores = new int[numStudents][numTests]; 2D Arrays Suppose we want a 2D array that stores a pay scale. It would be declared as: or double payScaleTable; double payScaleTable; and created by payScaleTable = new double[4][5]; 2D Arrays Accessing an element of a twodimensional array. 2D Arrays Arrays are a specific structure Two dimensional arrays do not have to be tables!!! They are an array of arrays How do you check number of rows? Columns? Use the length instance field 2D Arrays The sample array creation payScaleTable = new double[4][5]; is a shorthand for payScaleTable = new double [4][ ]; payScaleTable[0] = new double [5]; payScaleTable[1] = new double [5]; payScaleTable[2] = new double [5]; and so on. Executing the statements on the left in sequence will create the array of arrays shown on the right. 2D Arrays The expression refers to the length of the payScaleTable array itself. payScaleTable.length The expression 2D Arrays payScaleTable[1].length refers to the length of the array stored at index 1 of payScaleTable. Questions How can we declare a symmetrical table, where we only specify half the values? In other words, [0][1] == [1][0] How do we represent a cube? How do you "traverse", or go through the elements of an multidimensional array? Copying Arrays Arrays are reference variables, so we treat them like other objects Copying an array variable yields a second reference to the same array double data = // fill array . double prices new double[10]; . . = data; Cloning Use clone to make true copy double prices = (double) data.clone(); // Note: clone returns an object, so we // type cast Cloning Copying Elements System.arraycopy() not encouraged Hard to manipulate Using for loops is more powerful Copying certain elements How do I copy count positions from array from to array to, starting at positions fromStart and toStart respectively? Copying Certain Elements Answer: Use for loops! for(int i = 0; i < count; i++) { to[toStart + i] = from[fromStart + i]; } To insert, we'll make a new array, copy over the elements with the new element inserted Inserting a Value // insert x in position i int newData = new int[data.length+1]; // <loop to copy elements before i> newData[i] = x; // <loop to copy elements after i> data = newData; // set data to new version Deleting a Value Deleting is similar: Make a new copy without the old element // Remove position i int newData = new int[data.length-1]; // <loop to copy elements before i> // <loop to copy elements after i> data = newData; If the array is full and you need more space, you can grow the array Can't simply expand need to create new array Create a new, larger array. double newData = new double[2*data.length]; Growing Arrays Copy all elements into the new array Store the reference to the new array in the array variable data = newData; Passing Arrays to Methods Exactly the same as objects, the reference is passed to method parameters Same thing if returning an array Remember that if you change an object in a method, the change affects others who use that object Passing Arrays to Methods public int searchMinimum(double number) { int indexOfMinimum = 0; for (int i = 1; i < number.length; i++){ if (number[i] < number[indexOfMinimum]) { //found a smaller element indexOfMinimum = i; } } return indexOfMinimum; } To call this method (from a method of the same class), we write double arrayOne; //create and assign values to arrayOne ... //get the index of the smallest element of arrayOne int minOne = searchMinimum(arrayOne); //output the result System.out.print("Minimum value in Array One is "); System.out.print(arrayOne[minOne] + "at position " + minOne); ... Passing Arrays to Methods Passing Arrays to Methods length is especially important in methods, since we have no other way of knowing the size (except by sending another parameter) When returning an array, we can store it in a reference variable: double scores = getDoubles("Enter 10 scores"); Passing an array to a method means we are passing a reference to an array. Passing Arrays to Methods Example: Candy in a Machine Declare a 2D array of double values named machine that represents the price of each candy item in a given row and column of a candy machine. 2001 Deb Deppeler. All rights reserved. Example: Candy in a Machine c=0 r=0 Create the 2D array .50 .90 .40 .75 .80 .95 1 .45 .55 1.10 2 .60 .70 .30 3 .85 .65 .35 4 with 3 rows and 5 columns. 1 Assign prices to each item. 2 machine[r][c] = ?? 2001 Deb Deppeler. All rights reserved. Example: Candy in a Machine Can we use initializer lists for multi double machine = { dimensional arrays. { 0.50, 0.90, 0.40 }, Only at time of declaration. } ; { { { { 0.75, 0.45, 0.60, 0.85, 0.80, 0.55, 0.70, 0.65, 0.95 1.10 0.30 0.35 }, }, }, } 2001 Deb Deppeler. All rights reserved. Example: Candy in a Machine Write a code fragment to increase the price of all items by 5 cents. for ( int i=0; i < machine.length; i++ ) for ( int j=0; j < machine[i].length; j++ ) machine[i][j] = machine[i][j] + 0.05; 2001 Deb Deppeler. All rights reserved. ...
View Full Document

This note was uploaded on 08/08/2008 for the course CS 302 taught by Professor Willbenton during the Spring '07 term at Wisconsin.

Ask a homework question - tutors are online