290 likes | 502 Vues
Chapter 8 One-Dimensional Arrays. Lecture Slides to Accompany An Introduction to Computer Science Using Java (2nd Edition) by S.N. Kamin, D. Mickunas, E. Reingold. Chapter Preview. In this chapter we will: introduce the array as a structure for storing large amounts of data
E N D
Chapter 8One-Dimensional Arrays Lecture Slides to Accompany An Introduction to Computer Science Using Java (2nd Edition) by S.N. Kamin, D. Mickunas, E. Reingold
Chapter Preview In this chapter we will: • introduce the array as a structure for storing large amounts of data • discuss common array operations • introduce algorithms for searching and sorting arrays • show how multiple images can be painted from an array to use in programming simple animations
Array Declarations • Arrays contain a fixed number of variables of identical type • Array declaration and allocation are separate operations • Declaration examples: int[] counts; double[] scores; String[] studentNames;
Array Allocation • Arrays are allocated using the Java new operator • The syntax is: new type[size]; • Examples: counts = new int[10]; scores = new double[15]; studentNames = new String[10];
Array Organization 0 1 2 3 4 5 6 7 8 9 counts • Each box is an int variable • The numbers on top are each variable’s subscript or index • An array of size 10 has subscripts 0 to 9
Array Subscripts • Arrays can contain any one type of value (either primitive values or references) • Subscripts are used to access specific array values • Examples: counts[0] // first variable in counts counts[1] // second variable in counts counts[9] // last variable in counts counts[10] // error – trying to access // variable outside counts
Expressions as Subscripts • Array subscripts do not have to be constants • Array subscripts do need to be integer expressions that evaluate to valid subscript values for the current array allocation • Examples: counts[i] counts[2*i] counts[I/2]
Array Initialization • Arrays can be initialized by giving a list of their elements • If your list contains n elements the subscripts will range from 0 to n – 1 • You do not need to allocate the array explicitly after it is initialized • Example: int [] primes = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29};
Initializing an Array of Strings final Sring[ ] NAME = { “Sunday”, “Monday”, “Tuesday”, “Wednesday”, “Thursday”, “Friday”, “Saturday”}; // procedure that prints the day of week public void printName (int day, OutputBox out) { out.print(NAME[day – 1]); }
Aliases • It is possible to have two different variables refer to the same array • When this happens these variables are called aliases • Creating aliases is not a good programming practice • Example of how it can happen: int [ ] A, B; … B = new int [10]; A = B;
Loops and Array Processing • Initializes counts to 0, 10, 20, … , 90 for (int i=0; i < 10; i++) { counts[i] = i * 10; } • Prints the contents of counts using length for (int i=0; i < counts.length; i++) { out.println(counts[i]); }
Extra Capacity Array • Arrays cannot grow after they have been allocated • You can allocate more space than you believe your application will need • If you guess too low, you will still run out of space • You do not need to use all the elements in an array (but total computer memory is finite)
Searching • This loop terminates as soon as it finds the value 90 stored in grades bool found = false; int i = 0; while (i < size && !found) { // 90 is not in grades[0]..grades[i - 1] if (grades[i] == 90) found = true; else i++; }
Processing Parallel Arrays • This loop counts the number of students whose performance improved from the first test to the second int improved = 0; for (int i = 0; i < size; i++) { if (grades1[i] < grades2[i]) improved++; }
Arrays of Objects • Arrays of objects are declared in the same manner as arrays of primitive variables • Assuming that a class Student was declared elsewhere a client application could declare and allocate an array of 10 students using Student[ ] students; students = new Student[10];
Passing Arrays as Arguments • When an array is passed as an argument to a method, what is passed is a pointer to the array, not a new array (arrays are passed by reference) • This means that if the method makes changes to the array, these changes are still in effect when the method returns to its caller • This is not true for primitive values which are passed by value and not by reference • Method header example: public void read(Student[ ] students) {
Selection Sort • Find the smallest element among the elements A[0]..A[n-1] and call it A[min] • Swap A[0] and A[min] so A[0] contains the smallest element and A[1]..A[n-1] not sorted • Now the smallest element among the elements A[1]..A[n-1] and call it A[min] • Swap A[1] and A[min] so A[1] contains the second smallest element and A[2]..A[n-1] not sorted • Proceed similarly for A[3], A[4], and so on
SelectionSort Class – part 1 public class SelectionSort { public void selectionSort (double[] A, int size) { for (int i=0; i < size; i++) { // elements in A[0]..A[i–1] are less than // elements in A[i]..A[size-1] and // A[0]..A[i-1] are sorted int min = findMinimum(A, i, size); swap(A, I, min); } }
SelectionSort Class – part 2 int findMinimum (double[] A, int i, int size) { int j, min = 1; for (j= i + 1; j < size; j++) // A[min] <= all elements in A[0]..A[j–1] if (A[j] < A[min]) min =j; return min; } void swap (double[] A, int I, int j) { double temp = A[i]; A[i] = A[j]; A[j] = temp; } }
Insertion Sort • Iterate over subscripts 1 to n-1 • At the ith step, shift the elements A[0]..A[i] so that this part of the array is sorted • Note: when the ith iteration begins elements A[0]..A[i – 1] are already sorted, so the only shifting is that required to insert A[i] into A[0]..A[i-1]
InsertionSort Class class InsertionSort { public void InsertionSort (double[] A, int size) { int i,j; for (int i=1; i < size; i++) { double Ai = A[i]; j = j - 1; while (j >= 0 && A[j] > Ai) { A[j + 1] = A[j]; j--; } A[j + 1] = A[i]; } } }
Linear Search int linearSearch (int[] A, int key) int i; for (i = 0; i < A.length; i++) { // key not in A[0]..A[i - 1] if (A[i] == key) return i; // key not in A return –1; }
Searching • When searching for int values you can test for exact matches using (A[i] == key) • Comparing two double values for equality will not always give a correct result • A better comparison for doubles would be (Math.abs(A[i] – key) < epsilon) • Epsilon should be as small a value as is acceptable for your application
Using Arrays in Animation Image[] mouse = new Image[NUMBER]; Int[] sleepTime = {1540, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240}; public void show( ) { for (int i = 0; i < NUMBER; i++) mouse[i] = Toolkit.getDeafaultTool(). getImage(“images/T”+(i+1)+”gif); ticker = 0; do { g.drawImage(mouse[ticker}, 70, 70); Timer.pause(sleepTime{ticker]); ticker = (ticker + 1) % NUMBER; } while (true); } }