arrays csc 171 fall 2002 lecture 20. arrays suppose we want to write a program that reads a set of...
Post on 20-Dec-2015
216 views
TRANSCRIPT
ArraysArrays
CSC 171 FALL 2002
LECTURE 20
ArraysArrays
Suppose we want to write a program that reads a set of test grades and prints them, marking the highest grade?65.2
81.7
31.3
95.4 < - highest grade
76.1
58.6
Individual data itemsIndividual data items
If we knew that there were always 150 students in the class, we could store the data as individual variables– score1,score2,score3, . . , score150
What would the data entry code look like?
What would the printing code look like?How about finding the max?
ArraysArrays
An array is a collection of data items of the same type
Every element of the collection can be accessed separately.
___________________ is a fixed length sequence of values of the same type.
_An array__________ is a fixed length sequence of values of the same type.
Constructing ArraysConstructing Arrays
double [] data = new double[10];
double [] data = new double[10];
int x = data.length ;
//instance field on arrays, x = = 10
Setting Array valuesSetting Array valuesTo get values into an array you need to
specify which slot you want to use.Specification is done with the [ ] operatorThe [ ] operator follows the name of the
arrayThe [ ] operator encloses and integer-valued
expression called the index or subscript
Setting array valuesSetting array values
data[4] = 29.95;
0123456789
Using array valuesUsing array values
Similar to setting
int i = 4 ;
System.out.println(“data[“+i+”] ==“+ data[i]);
> data[4] ==29.95
You access array elements with and integer position number, called the _______________, using the notation _______________.
You access array elements with and integer position number, called the ___index_______, using the notation ____a[index]___________.
Array data itemsArray data itemsSuppose we want to write a program that
reads a set of test grades and prints them, marking the highest grade?
What would the data entry code look like?What would the printing code look like?How about finding the max?
Array issuesArray issues
Does it work?
double [] data = new double[10];
data[10] = 5.4;
Array issuesArray issues
Does it work?
double [] data = new double[10];data[10] = 5.4;
When the program runs, an out-of-bounds subscript generates an exception and terminates the program – why?
Position numbers of an array range from _________ to ____________.
Position numbers of an array range from ___0_______ to ____a.length -1_________.
Accessing a nonexistent position results is a ______________ error.
Accessing a nonexistent position results is a _bounds_____ error.
Use the ___________________field to find the number of elements in an array.
Use the _____length______field to find the number of elements in an array.
Array issuesArray issues
Can we search for the top grade as follows
double maxScore = data[0];
for (int i = 1;I<=data.length;i++)
If (data[i] > maxScore)
maxScore = data[i];
Array issuesArray issues
An array of length n has index values from 0 to (n-1)
double maxScore = data[0];
for (int i = 1;I<data.length;i++)
If (data[i] > maxScore)
maxScore = data[i];
Array issuesArray issues
Does it work?
public static void main(String[] args){ double[] data;
If (data[0] > 4.0)
System.out.println(“GT 4!”);
}
Array issuesArray issues
Arrays must be allocated!
public static void main(String[] args){ double[] data = new double[10];
If (data[0] > 4.0)
System.out.println(“GT 4!”);
}
Array issuesArray issues
Arrays can be initialized!
public static void main(String[] args){ double[] data = {2,3,4,5,6};
If (data[0] > 4.0)
System.out.println(“GT 4!”);
}
// note: new int[] {2,3,4,5,6} ; is also legal
Copying ArraysCopying Arrays
Is this ok?
double [] data = new double[10];
double[] testScores;
testScores = data;
Copying ArraysCopying Arrays
Is this ok?
double [] data = new double[10];
double[] testScores;
testScores = data;
How many arrays are there?
Copying Array REFERENCESCopying Array REFERENCESdouble [] data = new double[10];double[] testScores;testScores = data;
Copying ArraysCopying Arrays
So, what if we want to make two “real” copies – what does the code look like?
Write a method so that
int[] x = {3,4,5,6,7,8,9,10};
int[] y = myCopy(x);
CopyingCopying
public static int[] myCopy(int[] x){
int[] r_arry = new int[x.length];
for (int i = 0 ; i< x.length;i++)
r_arry[i] = x[i];
return r_arry;
}
System.arrayCopySystem.arrayCopy//System.arraycopy(from,fromstart,to,toStart,count);
System.arraycopy(data,0,prices,0,data.length);
CloneClone
An array variable stores a ________________________. Copying the variable yields a second ____________________ to _________________ array.
An array variable stores a ______reference__________. Copying the variable yields a second ______reference______________ to ____the same_____________ array.
Use the ________________ method to copy the elements of an array.
Use the ____clone______ method to copy the elements of an array.
Use the _____________________________ method to copy elements from one array to another.
Use the _System.arraycopy____________________ method to copy elements from one array to another.
If you run out of space in an array you need to _______________ a larger array and copy the elements into it.
If you run out of space in an array you need to __allocate_____ a larger array and copy the elements into it.
Getting a Bigger ArrayGetting a Bigger Array
More ArraysMore Arrays
Suppose we want to write a program that reads a set of test product names, prices, and quality scores prints them, marking the best value? (score/prices)Digital 500X, $3499.00, score 73
ZEOS Pentium-III/500, $2545.00, score 70
Micro Express MF, $2195.00, score 72 < - best value
Polywell Poly 450IP, $2099.00, score 30
Parallel ArraysParallel Arrays
One solution, can you think of a better one?
Arrays of ObjectsArrays of ObjectsEasier to deal with - arrays hold references
Avoid ___________________________ arrays by changing them into arrays of objects.
Avoid ____________parallel_______ arrays by changing them into arrays of objects.
Multidimensional ArraysMultidimensional Arrays
Arrays of arrays– Arrays are objects– Arrays hold references to objects– Ergo, arrays can hold arrays
Tables are 2D arraysTables are 2D arraysint size = 5;int[][] mtable = new int[size][size];for(i=0;i<size;i++)
for(int j=0;j<size;j++)mtable[i][j] = (i+1)*(j+1);
1 2 3 4 5
2 4 6 8 10
3 6 9 12 15
4 8 12 16 20
5 10 15 20 25
// how easy to modify code ????
int[][] mtable = new int[5][5];
for(i=0;i<5;i++)
for(int j=0;j<5;j++)
mtable[i][j] = (i+1)*(j+1);
Arrays of ArraysArrays of Arrays
int [][] powers = new int[10][10];
Arrays of ArraysArrays of Arrays
int [][] pow2 = {{1,2,3},{4,5,6},{7,8,9}};
1 2 3
4 5 6
7 8 9
Allocating arrays of arraysAllocating arrays of arrays
int size = 10;int[][] mtable = new int[size][];for(i=0;i<mtable.length;i++) {
mtable[i]= new int[size];for(int j=0;j<mtable[i].length;j++)
mtable[i][j] = (i+1)*(j+1);}
AlternatelyAlternately
The following is legal.What is the structure?
int[][] b = new int[5][];
for (int i=0;i<b.length;i++)
b[i] = new int[i+1];
AlternatelyAlternately
int[][] b = new int[5][];for (int i=0;i<b.length;i++)
b[i] = new int[i+1];
This is known as a triangular arrayIs b[3][1] a legal reference or b[1]
[3]?
Two dimensional arrays form a ___________________________ arrangement. You access elements with an index pair using the notation ______________.
Two dimensional arrays form a _tabular, two dimensional_______ arrangement. You access elements with an index pair using the notation _____a[i][j]_________.
Passing ArraysPassing ArraysIn JAVA
– Primitives are passed by value A copy of the variable is made & used Modifications made do not affect calling value public void myAdd(int x) { x++;}
– Objects are passed by reference Since the reference is passed it is possible to change
the value in the calling method Public void myAdd (int[] x) {x[0]++;}
Pass by valuePass by value
public class passArry {
public static void main(String args[]){
int x1 = 3;
System.out.println("x1 == "+x1);
myAdd(x1);
System.out.println("x1 == "+x1);
}
public static void myAdd(int x) {x++;}
}
Pass by referencePass by reference
public class passArry {
public static void main(String args[]){
int[] x2 = {4,5,6};
System.out.println("x2[0] == "+x2[0]);
myAdd(x2);
System.out.println("x2[0] == "+x2[0]);
}
public static void myAdd(int[] x) {x[0]++;}
}
Local referenceLocal reference
class Student {
int age;
// …..
public void setAge(int age){
age = age;
}
}
Local referenceLocal reference
class Student {
int age;
// …..
public void setAge(int age){
this.age = age;
}
}
ExerciseExercise
Write a method that takes an integer array and prints the values
ExerciseExercise
Write a method that takes an integer array and prints the values
public static int myPrint(int[] x){
for (int i = 0 ; i<x.length;i++)
System.out.println(x + “[“+i+”] == “+ x[i]);
}
ExerciseExercise
Write a method that takes an integer array, and two integer indices and swaps the value
ExerciseExerciseWrite a method that takes an integer array, and
two integer indices and swaps the value
public static void mySwap(int[] x, int i, int j){ int temp = x[i];
x[i] = x[j];
x[j] = temp;
}
Interpretive DanceInterpretive Dance
Some people are “visual” learners
Some people are “aural” learners
Some people are “symbolic” learners
Some people are “body” learners
Every kindergardener learns how to sort.
SortingSorting
Write a method that takes an array and sorts via the kindergarden method.
BubblesortBubblesortWrite a method that takes an array and
sorts via the kindergarden method.public static void bubbleSort(int[] x){
for (int j=0;j<x.length;j++)
for (int i = 0 ; i<x.length-1;i++)
if (x[i] > x[i+1]) mySwap(x,i,i+1);
}
// how many comparisions do we make?
Counting comparisonsCounting comparisons
If the length of the array is “n”
The outer loop executes “n” time
Each time the outer loop executes, the inner loop executes “(n-1)” time
So, we get n(n-1) comparisions
Exercise: SEARCHExercise: SEARCH
Write a method that takes an integer array and returns the index of the maximum value
ExerciseExerciseWrite a method that takes an
integer array and returns the index of the maximum value
public static int myMax(int[] x){ int rvalue = 0;for (int i = 0 ; i<x.length;i++) if (x[i] > x[rvalue]) rvalue = i;return rvalue;
}
ExerciseExercise
Overload the max finder to take an array and an index – the method now returns the index of the maximum value >= the index passed in
ExerciseExerciseOverload the max finder to take an
array and an index – the method now returns the index of the maximum value >= the index passed in
public static int myMax(int[] x, int j){ int rvalue = j;for (int i = j ; i<x.length;i++) if (x[i] > x[rvalue]) rvalue = i;return rvalue;
}
SortingSorting
Write a method that takes an integer arrayLoop through all the positions in the array,
one after the otherAt each (current) position, find the max
from that position to the rest of the array.Swap the value with the current positionThis is termed selection sort
Selection SortSelection SortDoes it work?public void selSort(int x){
for (int i = 0 ; i<x.length;i++){int temp = myMax(x,i);mySwap(x,i,temp);
}}Can you prove it works?What is the loop invariant?
Swap max “^” with first “|”Swap max “^” with first “|”
{1,9,2,8,3,7,4,6,5}
| ^ {9,1,2,8,3,7,4,6,5}
| ^ {9,8,2,1,3,7,4,6,5}
| ^ {9,8,7,1,3,2,4,6,5}
| ^
{9,8,7,6,3,2,4,1,5}
| ^ {9,8,7,6,5,2,4,1,3}
| ^ {9,8,7,6,5,4,2,1,3}
| ^ {9,8,7,6,5,4,3,1,2}
| ^
Run time analysisRun time analysis
How long does it take SectionSort to run on an array of a given length?
Count the loopsCount the loopsn is the length of the arrayThe outer (i) loop executes from 0 to n-
2 – n-1 times
The on each cycle of the outer loop i has a certain (different) value
On each cycle of the outer loop, the inner loop executes from I + 1 to n –1– n – i – 1 times
So, we getSo, we get
N-2
n-i-1) i=0
Can we prove ?Can we prove ?
N-2
n-i-1) = = i=0
n(n-1)/2
Array ListsArray Lists
Consider Purse class Purse doesn't remember individual Coin objects,
just the total Don't know how many coins--can't have variables
coin1...coin10 Use ArrayList to store variable number of objects
ArrayList coins = new ArrayList();coins.add(new Coin(0.1, "dime"));. . .
size method yields number of elements
An ______________________ is a sequence of objects.
An _array list______ is a sequence of objects.
Retrieving Array List ElementsRetrieving Array List Elements
Use get method Index starts at 0 Must cast to correct type Coin c = coins.get(0); // gets first coin Bounds error if index is out of range Most common bounds error:
int n = coins.size();c = (Coin)coins.get(n); // ERROR // legal index values are 0...n-1
To store a primitive type in an array list you must use a ____________ class.
To store a primitive type in an array list you must use a __wrapper__ class.
When retrieving an element from an array list, you need to ________________ the return value of the ________________ method to the element class.
When retrieving an element from an array list, you need to __cast____ the return value of the _______get__ method to the element class.
Position number of an array list range from _________ to _______________. Accessing a nonexistent position results in a _________ error.
Position number of an array list range from _____0____ to ________size() - 1_______. Accessing a nonexistent position results in a ___counds______ error.