Upcoming SlideShare
Loading in …5
×

# Java căn bản - Chapter10

1,247 views
1,071 views

Published on

0 Comments
0 Likes
Statistics
Notes
• Full Name
Comment goes here.

Are you sure you want to Yes No
Your message goes here
• Be the first to comment

• Be the first to like this

No Downloads
Views
Total views
1,247
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide
• We will cover the basic array processing in this lesson, manipulating arrays of primitive data types and objects.
• Suppose you need to handle up to 300 Student objects in a program for maintaining a high school alumni list, would you use 300 variables? Suppose you need to process daily temperatures for a 12-month period in a science project, would you use 365 variables? You can, but would you? To manipulate a collection of data, we can use arrays.
• As you can declare and create objects in one statement such as Person p = new Person( ); you can declare and create an array in one statement as double[ ] rainfall = new double[12]; Strictly speaking, an array is a reference data type and really an object because there is no class called Array in Java. The thumbnail note in page 413 is therefore not 100 percent accurate.
• This code computes the average annual rainfall. Notice the public constant length returns the capacity, not the actual number of non-blank values in the array.
• This code also computes the average annual rainfall, but this time we use the second array, an arrray of String so the prompt becomes &amp;quot;Rainfall for January&amp;quot;, &amp;quot;Rainfall for February&amp;quot;, and so forth. Notice how the monthName array is used in the for loop.
• This code computes the average rainfall for each quarter. The inner loop is used to compute the rainfall for a given quarter. The outer loop processes the four quarters. This is how the values for i, j, and 3*i+j change: i j 3*i+j 0 0 0 1 1 2 2 1 0 3 1 4 2 5 2 0 6 1 7 2 8 3 0 9 1 10 2 11 The sample code is equivalent to for (int i = 0; i &lt; 3; i++ ) { quarterAverage[0] += rainfall[i]; quarterAverage[1] += rainfall[i+3]; quarterAverage[2] += rainfall[i+6]; quarterAverage[3] += rainfall[i+9]; } quarterAverage[0] = quarterAverage[0] / 3.0; quarterAverage[1] = quarterAverage[1] / 3.0; quarterAverage[2] = quarterAverage[2] / 3.0; quarterAverage[3] = quarterAverage[3] / 3.0;
• When an array is initialized in this manner, its capacity is set to the number of elements in the list.
• Instead of declaring the array size to a fixed value, it is possible to declare its size at the runtime. For example, we can prompt the user for the size of an array as illustrated in the sample code shown here.
• By combining the power of arrays and objects, we can structure programs in a clean, logical manner. Without an array of objects, to represent a collection of Account objects, for example, we need to use several different arrays, one for names, one for addresses, and so forth. This is very cumbersome and error-prone.
• The indexed expression person[i] is used to refer to the (i+1)st object in the person array. Since this expression refers to an object, we write person[i].setAge( 20 ); to call this Person object’s setAge method, for example. This is the syntax we use to call an object’s method. We are just using an indexed expression to refer to an object instead of a simple variable.
• Here’s another approach with two Person variables: Person youngest, //points to the youngest person oldest; //points to the oldest person youngest = oldest = person[0]; for (int i = 1; i &lt; person.length; i++) { if ( person[i].getAge() &lt; youngest.getAge() ) { youngest = person[i]; //found a younger person } else if ( person[i].getAge() &gt; oldest.getAge() ) { oldest = person[i]; //found an older person } } outputBox.printLine(&amp;quot;Oldest : &amp;quot; + oldest.getName() + &amp;quot; is &amp;quot; + oldest.getAge() + &amp;quot; years old.&amp;quot;); outputBox.printLine(&amp;quot;Youngest: &amp;quot; + youngest.getName() + &amp;quot; is &amp;quot; + youngest.getAge() + &amp;quot; years old.&amp;quot;);
• In this approach, we simply leave the position of a deleted object to a null. With this approach, an array index positions will be a mixture of null and real pointers.
• With the second approach, we divide the array into two parts: the first part contains the real references and the second part contains the null references. When we delete a node, a hole will result and we must fill this hole. There are two possible solutions. The first solution is to pack the elements. If an object at position J is removed (i.e., this position is set to null), then elements from position J+1 till the last non-null reference are shifted one position lower. And, finally, the last non-null reference is set to null. The second solution is to replace the removed element by the last element in the array. The first solution is necessary if the Person objects are arranged in some order (e.g., in ascending order of age). The second solution is a better one if the Person objects are not arranged in any order.
• Here’s another approach with two Person variables: Person youngest, //points to the youngest person oldest; //points to the oldest person youngest = oldest = person[0]; for (int i = 1; i &lt; person.length; i++) { if ( person[i].getAge() &lt; youngest.getAge() ) { youngest = person[i]; //found a younger person } else if ( person[i].getAge() &gt; oldest.getAge() ) { oldest = person[i]; //found an older person } } System.out.println(&amp;quot;Oldest : &amp;quot; + oldest.getName() + &amp;quot; is &amp;quot; + oldest.getAge() + &amp;quot; years old.&amp;quot;); System.out.println(&amp;quot;Youngest: &amp;quot; + youngest.getName() + &amp;quot; is &amp;quot; + youngest.getAge() + &amp;quot; years old.&amp;quot;);
• When an array is passed to a method, only its reference is passed. A copy of the array is NOT created in the method. public int searchMinimum(float[] number) { int indexOfMinimum = 0; for (int i = 1; i &lt; number.length; i++) { if (number[i] &lt; number[indexOfMinimum]) { //found a indexOfMinimum = i; //smaller element } } return indexOfMinimum; }
• In Java, data may be organized in a two-dimensional array. A table is an example of a two-dimensional array. In a two-dimensional array, two indices (in a table, one for the row and one for the column) are used to refer to the array element.
• payScaleTable = new double[4][5]; is really a shorthand for payScaleTable = new double[4][ ]; payScaleTable[0] = new double[5]; payScaleTable[1] = new double[5]; payScaleTable[2] = new double[5]; payScaleTable[3] = new double[5]; which is equivalent to payScaleTable = new double[4][ ]; for (int i = 0; i &lt; 4; i++) { payScaleTable[i] = new double[5]; }
• The concept of the two-dimensional array in Java is just that: a concept. There is no explicit structure called the “two-dimensional array” in Java. The two-dimensional array concept is implemented by using an array of arrays.
• An array that is part of another array is called a subarray. An array of arrays may be initialized when it is created.
• One Java interface we have seen is the ActionListener interface. The declaration for an interface includes the reserved word &apos;interface&apos;. In the declaration, we list the method headers (i.e. a method without body) only.
• A list being linear means the object, or elements, in the list are positioned in a linear sequence. That is, l0 is the first element, l1 is the second element, and so forth. A list has not size limit; there is no set limit to the number of elements we can add to a list.
• There are total of 25 methods defined in the List interface. The five listed here are the very frequently used subset of those 25 methods.
• Because both the ArrayList and LinkedList classes implement the same interface, we know that instances of ArrayList and LinkedList behave the same way, i.e., they support the same set of public methods defined in the List interface.
• We can add to, remove from, and retrieve objects in a given list. A list does not have a set limit to the number of objects we can add to it.
• There are total of 14 methods defined in the List interface. The five listed here are the very frequently used subset of these 14 methods.
• The (key, value) pair for this sample map is the course number and the course title, respectively.
• Please use your Java IDE to view the source files and run the program.
• Here&apos;s the pseudocode to locate a person with the designated name. Notice that for this routine to work correctly, the array must be packed with the real pointers in the first half and null pointers in the last half.
• Here&apos;s the pseudocode to delete a person with the designated name. First we locate the person. If the person is not found, we exit the delete routine. If the person is found, then we remove it and fill the hole.
• ### Java căn bản - Chapter10

1. 1. Chapter 10 Arrays
2. 2. Objectives <ul><li>After you have read and studied this chapter, you should be able to </li></ul><ul><ul><li>Manipulate a collection of data values, using an array. </li></ul></ul><ul><ul><li>Declare and use an array of primitive data types in writing a program. </li></ul></ul><ul><ul><li>Declare and use an array of objects in writing a program </li></ul></ul><ul><ul><li>Define a method that accepts an array as its parameter and a method that returns an array </li></ul></ul><ul><ul><li>Describe how a two-dimensional array is implemented as an array of arrays </li></ul></ul><ul><ul><li>Manipulate a collection of objects, using lists and maps </li></ul></ul>
3. 3. Array Basics <ul><li>An array is a collection of data values. </li></ul><ul><li>If your program needs to deal with 100 integers, 500 Account objects, 365 real numbers, etc., you will use an array. </li></ul><ul><li>In Java, an array is an indexed collection of data values of the same type. </li></ul>
4. 4. Arrays of Primitive Data Types <ul><li>Array Declaration </li></ul><ul><ul><ul><ul><li><data type> [ ] <variable> //variation 1 </li></ul></ul></ul></ul><ul><ul><ul><ul><li><data type> <variable> [ ] //variation 2 </li></ul></ul></ul></ul><ul><li>Array Creation </li></ul><ul><ul><ul><ul><li><variable> = new <data type> [ <size> ] </li></ul></ul></ul></ul><ul><li>Example </li></ul>double [ ] rainfall; rainfall = new double [ 12 ] ; Variation 1 double rainfall [ ] ; rainfall = new double [ 12 ] ; Variation 2 An array is like an object!
5. 5. Accessing Individual Elements <ul><li>Individual elements in an array accessed with the indexed expression. </li></ul>The index of the first position in an array is 0 . double [] rainfall = new double [ 12 ] ; rainfall 0 1 2 3 4 5 6 7 8 9 10 11 rainfall[2] This indexed expression refers to the element at position #2
6. 6. Array Processing – Sample1 double [] rainfall = new double [ 12 ] ; double annualAverage, sum = 0.0; for ( int i = 0; i < rainfall.length; i++ ) { rainfall [ i ] = Double.parseDouble ( JOptionPane.showinputDialog ( null , &quot;Rainfall for month &quot; + ( i+1 ) ) ) ; sum += rainfall [ i ] ; } annualAverage = sum / rainfall.length; The public constant length returns the capacity of an array.
7. 7. Array Processing – Sample 2 double [] rainfall = new double [ 12 ] ; String [] monthName = new String [ 12 ] ; monthName [ 0 ] = &quot;January&quot; ; monthName [ 1 ] = &quot;February&quot; ; … double annualAverage, sum = 0.0; for ( int i = 0; i < rainfall.length; i++ ) { rainfall [ i ] = Double.parseDouble ( JOptionPane.showinputDialog ( null , &quot;Rainfall for &quot; + monthName [ i ] )) ; sum += rainfall [ i ] ; } annualAverage = sum / rainfall.length; The same pattern for the remaining ten months. The actual month name instead of a number.
8. 8. Array Processing – Sample 3 <ul><li>Compute the average rainfall for each quarter. </li></ul>//assume rainfall is declared and initialized properly double [] quarterAverage = new double [ 4 ] ; for ( int i = 0; i < 4; i++ ) { sum = 0; for ( int j = 0; j < 3; j++ ) { //compute the sum of sum += rainfall [ 3*i + j ] ; //one quarter } quarterAverage [ i ] = sum / 3.0; //Quarter (i+1) average }
9. 9. Array Initialization <ul><li>Like other data types, it is possible to declare and initialize an array at the same time. </li></ul>int [] number = { 2, 4, 6, 8 } ; double [] samplingData = { 2.443, 8.99, 12.3, 45.009, 18.2, 9.00, 3.123, 22.084, 18.08 } ; String [] monthName = { &quot;January&quot; , &quot;February&quot; , &quot;March&quot; , &quot;April&quot; , &quot;May&quot; , &quot;June&quot; , &quot;July&quot; , &quot;August&quot; , &quot;September&quot; , &quot;October&quot; , &quot;November&quot; , &quot;December&quot; } ; number.length samplingData.length monthName.length 4 9 12
10. 10. Variable-size Declaration <ul><li>In Java, we are not limited to fixed-size array declaration. </li></ul><ul><li>The following code prompts the user for the size of an array and declares an array of designated size: </li></ul>int size; int [] number; size= Integer.parseInt ( JOptionPane.showInputDialog ( null , &quot;Size of an array:&quot; )) ; number = new int [ size ] ;
11. 11. Arrays of Objects <ul><li>In Java, in addition to arrays of primitive data types, we can declare arrays of objects </li></ul><ul><li>An array of primitive data is a powerful tool, but an array of objects is even more powerful. </li></ul><ul><li>The use of an array of objects allows us to model the application more cleanly and logically. </li></ul>
12. 12. The Person Class <ul><li>We will use Person objects to illustrate the use of an array of objects. </li></ul>The Person class supports the set methods and get methods. Person latte; latte = new Person ( ) ; latte.setName ( &quot;Ms. Latte&quot; ) ; latte.setAge ( 20 ) ; latte.setGender ( 'F' ) ; System.out.println ( &quot;Name: &quot; + latte.getName () ) ; System.out.println ( &quot;Age : &quot; + latte.getAge () ) ; System.out.println ( &quot;Sex : &quot; + latte.getGender () ) ;
13. 13. Creating an Object Array - 1 Code State of Memory Only the name person is declared, no array is allocated yet. Person [ ] person; person = new Person [ 20 ] ; person [ 0 ] = new Person ( ) ; A After is executed A person
14. 14. Creating an Object Array - 2 Code State of Memory Now the array for storing 20 Person objects is created, but the Person objects themselves are not yet created. person Person [ ] person; person = new Person [ 20 ] ; person [ 0 ] = new Person ( ) ; B After is executed B 0 1 2 3 4 16 17 18 19 person
15. 15. Creating an Object Array - 3 Code State of Memory One Person object is created and the reference to this object is placed in position 0. Person [ ] person; person = new Person [ 20 ] ; person [ 0 ] = new Person ( ) ; C 0 1 2 3 4 16 17 18 19 person 0 1 2 3 4 16 17 18 19 person After is executed C Person
16. 16. Person Array Processing – Sample 1 <ul><li>Create Person objects and set up the person array. </li></ul>String name, inpStr; int age; char gender; for ( int i = 0; i < person.length; i++ ) { name = inputBox.getString ( &quot;Enter name:&quot; ) ; //read in data values age = inputBox.getInteger ( &quot;Enter age:&quot; ) ; inpStr = inputBox.getString ( &quot;Enter gender:&quot;); gender = inpStr.charAt ( 0 ) ; person[i ] = new Person ( ) ; //create a new Person and assign value s person [ i ] .setName ( name ) ; person [ i ] .setAge ( age ) ; person [ i ] .setGender ( gender ) ; }
17. 17. Person Array Processing – Sample 2 <ul><li>Find the youngest and oldest persons. </li></ul>int minIdx = 0; //index to the youngest person int maxIdx = 0; //index to the oldest person for ( int i = 1; i < person.length; i++ ) { if ( person [ i ] .getAge () < person [ minIdx ] .getAge () ) { minIdx = i; //found a younger person } else if ( person [ i ] .getAge () > person [ maxIdx ] .getAge () ) { maxIdx = i; //found an older person } } //person[minIdx] is the youngest and person[maxIdx] is the oldest
18. 18. Object Deletion – Approach 1 Delete Person B by setting the reference in position 1 to null. int delIdx = 1; person [ delIdx ] = null ; 0 1 2 3 person A B C D A 0 1 2 3 person A C D Before is executed A After is executed A
19. 19. Object Deletion – Approach 2 Delete Person B by setting the reference in position 1 to the last person. int delIdx = 1, last = 3; person [ delIndex ] = person [ last ] ; person [ last ] = null ; 0 1 2 3 person A B C D A 0 1 2 3 person A C D Before is executed A After is executed A
20. 20. Person Array Processing – Sample 3 <ul><li>Searching for a particular person. Approach 2 Deletion is used. </li></ul>int i = 0; while ( person [ i ] != null && !person [ i ] .getName () .equals ( &quot;Latte&quot; ) ) { i++; } if ( person [ i ] == null ) { //not found - unsuccessful search System.out.println( &quot;Ms. Latte was not in the array&quot; ); } else { //found - successful search System.out.println( &quot;Found Ms. Latte at position &quot; + i); }
21. 21. Passing Arrays to Methods - 1 Code State of Memory minOne = searchMinimum(arrayOne); public int searchMinimum(float[] number)) { … } A. Local variable number does not exist before the method execution A At before searchMinimum A arrayOne
22. 22. Passing Arrays to Methods - 2 Code State of Memory minOne = searchMinimum(arrayOne); public int searchMinimum(float[] number)) { … } B. The value of the argument, which is an address, is copied to the parameter. arrayOne B arrayOne The address is copied at B number
23. 23. Passing Arrays to Methods - 3 Code State of Memory minOne = searchMinimum(arrayOne); public int searchMinimum(float[] number)) { … } C. The array is accessed via number inside the method. arrayOne number While at inside the method C C
24. 24. Passing Arrays to Methods - 4 Code State of Memory minOne = searchMinimum(arrayOne); public int searchMinimum(float[] number)) { … } D. The parameter is erased. The argument still points to the same object. arrayOne number D arrayOne At after searchMinimum D
25. 25. Two-Dimensional Arrays <ul><li>Two-dimensional arrays are useful in representing tabular information. </li></ul>
26. 26. Declaring and Creating a 2-D Array <ul><li>Declaration </li></ul><ul><ul><ul><ul><li><data type> [][] <variable> //variation 1 </li></ul></ul></ul></ul><ul><ul><ul><ul><li><data type> <variable>[][] //variation 2 </li></ul></ul></ul></ul><ul><li>Creation </li></ul><ul><li><variable> = new <data type> [ <size1> ][ <size2> ] </li></ul><ul><li>Example </li></ul>double[][] payScaleTable; payScaleTable = new double[4][5]; 3 2 1 0 4 3 2 1 0 payScaleTable
27. 27. Accessing an Element <ul><li>An element in a two-dimensional array is accessed by its row and column index. </li></ul>
28. 28. Sample 2-D Array Processing <ul><li>Find the average of each row. </li></ul>double [ ] average = { 0.0, 0.0, 0.0, 0.0 } ; for ( int i = 0; i < payScaleTable.length; i++ ) { for ( int j = 0; j < payScaleTable [ i ] .length; j++ ) { average [ i ] += payScaleTable [ i ][ j ] ; } average [ i ] = average [ i ] / payScaleTable [ i ] .length; }
29. 29. Java Implementation of 2-D Arrays <ul><li>The sample array creation </li></ul><ul><li>payScaleTable = new double[4][5]; </li></ul><ul><li>is really a shorthand for </li></ul><ul><ul><ul><ul><li>payScaleTable = new double [4][ ]; </li></ul></ul></ul></ul><ul><ul><ul><ul><li>payScaleTable[0] = new double [5]; </li></ul></ul></ul></ul><ul><ul><ul><ul><li>payScaleTable[1] = new double [5]; </li></ul></ul></ul></ul><ul><ul><ul><ul><li>payScaleTable[2] = new double [5]; </li></ul></ul></ul></ul><ul><ul><ul><ul><li>payScaleTable[3] = new double [5]; </li></ul></ul></ul></ul>
30. 30. 10.5 Two-Dimensional Arrays <ul><li>Subarrays may be different lengths. </li></ul><ul><li>Executing </li></ul><ul><ul><ul><ul><li>triangularArray = new double[4][ ]; </li></ul></ul></ul></ul><ul><ul><ul><ul><li>for (int i = 0; i < 4; i++) </li></ul></ul></ul></ul><ul><ul><ul><ul><li>triangularArray[i] = new double [i + 1]; </li></ul></ul></ul></ul><ul><li>results in an array that looks like: </li></ul>
31. 31. Lists and Maps <ul><li>The java.util standard package contains different types of classes for maintaining a collection of objects. </li></ul><ul><li>These classes are collectively referred to as the Java Collection Framework (JCF). </li></ul><ul><li>JCF includes classes that maintain collections of objects as sets, lists, or maps. </li></ul>
32. 32. Java Interface <ul><li>A Java interface defines only the behavior of objects </li></ul><ul><ul><li>It includes only public methods with no method bodies. </li></ul></ul><ul><ul><li>It does not include any data members except public constants </li></ul></ul><ul><ul><li>No instances of a Java interface can be created </li></ul></ul>
33. 33. JCF Lists <ul><li>JCF includes the List interface that supports methods to maintain a collection of objects as a linear list </li></ul><ul><li>L = (l 0 , l 1 , l 2 , . . . , l N ) </li></ul><ul><li>We can add to, remove from, and retrieve objects in a given list. </li></ul><ul><li>A list does not have a set limit to the number of objects we can add to it. </li></ul>
34. 34. List Methods <ul><li>Here are five of the 25 list methods: </li></ul>Returns the number of elements in the list int size ( ) Removes the element at position idx boolean remove ( int idx ) Returns the element at position idx Object get ( int idx ) Clears this list, i.e., make the list empty void clear ( ) Adds an object o to the list boolean add ( Object o )
35. 35. Using Lists <ul><li>To use a list in a program, we must create an instance of a class that implements the List interface. </li></ul><ul><li>Two classes that implement the List interface: </li></ul><ul><ul><li>ArrayList </li></ul></ul><ul><ul><li>LinkedList </li></ul></ul><ul><li>The ArrayList class uses an array to manage data. </li></ul><ul><li>The LinkedList class uses a technique called linked-node representation . </li></ul>
36. 36. Sample List Usage <ul><li>Here's an example of manipulating a list: </li></ul>import java.util.*; List friends; Person person; friends = new ArrayList ( ) ; person = new Person ( &quot;jane&quot;, 10, 'F'); friends.add ( person ) ; person = new Person ( &quot;jack&quot;, 6, 'M' ) ; friends.add ( person ) ; Person p = ( Person ) friends.get ( 1 ) ;
37. 37. JCF Maps <ul><li>JCF includes the Map interface that supports methods to maintain a collection of objects (key, value) pairs called map entries. </li></ul>key value k 0 k 1 k n v 0 v 1 v n . . . . . . one entry
38. 38. Map Methods <ul><li>Here are five of the 14 list methods: </li></ul>Returns the number of elements in the map int size ( ) Removes the entry with the given key from the map boolean remove ( Object key ) Adds the given (key, value) entry to the map Object put ( Object key, Object value ) Returns true if the map contains an entry with a given key boolean containsKey ( Object key ) Clears this list, i.e., make the map empty void clear ( )
39. 39. Using Maps <ul><li>To use a map in a program, we must create an instance of a class that implements the Map interface. </li></ul><ul><li>Two classes that implement the Map interface: </li></ul><ul><ul><li>HashMap </li></ul></ul><ul><ul><li>TreeMap </li></ul></ul>
40. 40. Sample Map Usage <ul><li>Here's an example of manipulating a map: </li></ul>import java.util.*; Map catalog; catalog = new TreeMap ( ) ; catalog.put ( &quot;CS101&quot; , &quot;Intro Java Programming&quot; ) ; catalog.put ( &quot;CS301&quot; , &quot;Database Design&quot; ) ; catalog.put ( &quot;CS413&quot; , &quot;Software Design for Mobile Devices&quot; ) ; if ( catalog.containsKey ( &quot;CS101&quot; )) { System.out.println ( &quot;We teach Java this semester&quot; ) ; } else { System.out.println ( &quot;No Java courses this semester&quot; ); }
41. 41. Problem Statement <ul><li>Problem statement: </li></ul><ul><li>Write an AddressBook class that manages a collection of Person objects. An AddressBook object will allow the programmer to add, delete, or search for a Person object in the address book. </li></ul>
42. 42. Overall Plan / Design Document <ul><li>Since we are designing a single class, our task is to identify the public methods. </li></ul>Searches a specified Person object in the address book and returns this person if found. search Deletes a specified Person object from the address book. delete Adds a new Person object to the address book. add A constructor to initialize the object. We will include multiple constructors as necessary. AddressBook Purpose Public Method
43. 43. Development Steps <ul><li>We will develop this program in five steps: </li></ul><ul><ul><li>Implement the constructor(s). </li></ul></ul><ul><ul><li>Implement the add method. </li></ul></ul><ul><ul><li>Implement the search method. </li></ul></ul><ul><ul><li>Implement the delete method. </li></ul></ul><ul><ul><li>Finalize the class. </li></ul></ul>
44. 44. Step 1 Design <ul><li>Start the class definition with two constructors </li></ul><ul><li>The zero-argument constructor will create an array of default size </li></ul><ul><li>The one-argument constructor will create an array of the specified size </li></ul>
45. 45. Step 1 Code <ul><ul><ul><li>Directory: Chapter10/Step1 </li></ul></ul></ul><ul><ul><ul><li>Source Files: AddressBook.java </li></ul></ul></ul>Program source file is too big to list here. From now on, we ask you to view the source files using your Java IDE.
46. 46. Step 1 Test <ul><li>The purpose of Step 1 testing is to verify that the constructors work as expected. </li></ul>Test the normal cases. >= 1 Test the end case of valid data. 1 Test the end case of invalid data. 0 Test the invalid data. Negative numbers Purpose Argument to Constructor
47. 47. Step 2 Design <ul><li>Design and implement the add method </li></ul><ul><li>The array we use internal to the AddressBook class has a size limit, so we need consider the overflow situation </li></ul><ul><ul><li>Alternative 1 : Disallow adds when the capacity limit is reached </li></ul></ul><ul><ul><li>Alternative 2 : Create a new array of bigger size </li></ul></ul><ul><li>We will adopt Alternative 2 </li></ul>
48. 48. Step 2 Code <ul><ul><ul><li>Directory: Chapter10/Step2 </li></ul></ul></ul><ul><ul><ul><li>Source Files: AddressBook.java </li></ul></ul></ul>
49. 49. Step 2 Test <ul><li>The purpose of Step 2 test is to confirm that objects are added correctly and the creation of a bigger array takes place when an overflow situation occurs. </li></ul>Test that the new array is created and the Person object is added correctly (to the new array). Add the fifth Person object Test that the Person objects are added correctly. Add four Person objects Test that the array is created correctly. Create the array of size 4 Purpose Test Sequence
50. 50. Step 3 Design <ul><li>Design and implement the search method. </li></ul>loc = 0; while ( loc < count && name of Person at entry[loc] is not equal to the given search name ) { loc++; } if ( loc == count ) { foundPerson = null ; } else { foundPerson = entry[loc]; } return foundPerson;
51. 51. Step 3 Code <ul><ul><ul><li>Directory: Chapter10/Step3 </li></ul></ul></ul><ul><ul><ul><li>Source Files: AddressBook.java </li></ul></ul></ul>
52. 52. Step 3 Test <ul><li>To test the correct operation of the search method, we need to carry out test routines much more elaborate than previous tests. </li></ul>Test that the routine works correctly for other cases. Repeat the testing with the cases where the array is not fully filled, say, array length is 5 and the number of objects in the array is 0 or 3. Test that the routine works correctly for arrays of different sizes. Repeat the above steps with an array of varying sizes, especially the array of size 1. Test for the unsuccessful search. Search for a person not in the array. Test the normal case. Search for a person somewhere in the middle of the array. Test another version of the end case. Search for the person in the last position of the array Test that the successful search works correctly for the end case. Search for the person in the first position of the array Test that the array is created and set up correctly. Here, we will test the case where the array is 100 percent filled. Create the array of size 5 and add five Person objects with unique names. Purpose Test Sequence
53. 53. Step 4 Design <ul><li>Design and implement the delete method. </li></ul>boolean status; int loc; loc = findIndex ( searchName ) ; if ( loc is not valid ) { status = false; } else { //found, pack the hole replace the element at index loc+1 by the last element at index count ; status = true ; count--; //decrement count, since we now have one less element assert 'count' is valid; } return status;
54. 54. Step 4 Code <ul><ul><ul><li>Directory: Chapter10/Step4 </li></ul></ul></ul><ul><ul><ul><li>Source Files: AddressBook.java </li></ul></ul></ul>
55. 55. Step 4 Test <ul><li>To test the correct operation of the delete method, we need to carry out a detailed test routine. </li></ul>Test that the routine works correctly for other cases. Repeat testing where the array is not fully filled, say, an array length is 5 and the number of objects in the array is 0 or 3. Test that the routine works correctly for arrays of different sizes. Repeat the above steps by deleting persons at the first and last positions. Test that the unsuccessful operation works correctly. Attempt to delete a nonexisting person. Test that the delete method works correctly by checking the value null is returned by the search. Search for the deleted person. Test that the delete method works correctly. Delete the person in the array Verify that the person is in the array before deletion. Search for a person to be deleted next. Test the array is created and set up correctly. Here, we will test the case where the array is 100 percent filled. Create the array of size 5 and add five Person objects with unique names. Purpose Test Sequence
56. 56. Step 5: Finalize <ul><li>Final Test </li></ul><ul><ul><li>Since the three operations of add, delete, and search are interrelated, it is critical to test these operations together. We try out various combinations of add, delete, and search operations. </li></ul></ul><ul><li>Possible Extensions </li></ul><ul><ul><li>One very useful extension is scanning. Scanning is an operation to visit all elements in the collection. </li></ul></ul><ul><ul><li>Scanning is useful in listing all Person objects in the address book. </li></ul></ul>