Java: Learning to Program with Robots Chapter 10: Arrays Chapter - - PowerPoint PPT Presentation

java
SMART_READER_LITE
LIVE PREVIEW

Java: Learning to Program with Robots Chapter 10: Arrays Chapter - - PowerPoint PPT Presentation

Java: Learning to Program with Robots Chapter 10: Arrays Chapter Objectives After studying this chapter, you should be able to: Store data in an array, access a single element, process all elements, search for a particular element, and put


slide-1
SLIDE 1

Java:

Learning to Program with Robots Chapter 10: Arrays

slide-2
SLIDE 2

Chapter Objectives After studying this chapter, you should be able to:

  • Store data in an array, access a single element, process all

elements, search for a particular element, and put the elements in

  • rder
  • Declare, allocate, and initialize an array
  • Handle changing numbers of elements in an array, including

inserting a new element and deleting an existing one

  • Enlarge or shrink the size of an array
  • Manipulate data stored in a multi-dimensional array
slide-3
SLIDE 3

10.1 Using Arrays (1/2)

slide-4
SLIDE 4

10.1: Using Arrays (2/2) Wanted:

  • A way to easily work with 1,500 (or many more!) persons collected

from www.myspace.com.

  • Each person represented as an instance of the Person class:

Person

  • String name
  • int id
  • Gender gender
  • int age
  • String city
  • String province
  • String country
  • DateTime lastLogon
  • ??? friends

+Person(Scanner in) +String getName( ) +int getID( ) +Gender getGender( ) ...

slide-5
SLIDE 5

10.1.1: Visualizing An Array

Person[ ]

length 8 [0] [1] [2] [3] [4] [5] [6] [7] persons Steve, MALE, 16, St. Cat Ken, MALE, 18, Niagara-on Beth, FEMALE, 17, St. Cat Kathleen, FEMALE, 23, Tim Roydyn, MALE, 21, Fonth Kala, FEMALE, 18, Niaga Ali, MALE, 19, Boston, MS Zaki, FEMALE, 21, Kitch

slide-6
SLIDE 6

10.1.2: Accessing One Array Element

Person p3 = new Person(…); … persons … // An array of Person objects System.out.println(p3.getName()); System.out.println(persons[3].getName); if (p3.getGender() == Gender.FEMALE) { System.out.println(p3.getName() + " is female."); } if (persons[3].getGender() == Gender.FEMALE) { System.out.println(persons[3].getName() + " is female."); } persons[8].addFriend(p3); p3.addFriend(persons[8]); p3 = new Person(…); persons[3] = new Person(…);

slide-7
SLIDE 7

10.1.3: Swapping Array Elements (1/2)

public class PersonList extends Object { … persons … /** Swap the person object at index a with the object at index b. */ public void swap(int a, int b) { Person temp = this.persons[a]; this.persons[a] = this.persons[b]; this.persons[b] = temp; } }

Assume that swap(1, 2) has been called.

Person temp = this.persons[a];

Person[ ]

length 4 [0] [1] [2] [3] persons Steve, MALE, 16, St. Cat Ken, MALE, 18, Niagara-on Beth, FEMALE, 17, St. Cat Kathleen, FEMALE, 23, Tim temp

(trace continued on next slide)

slide-8
SLIDE 8

10.1.3: Swapping Array Elements (2/2)

this.persons[a] = this.persons[b];

Person[ ]

length 4 [0] [1] [2] [3] persons Steve, MALE, 16, St. Cat Ken, MALE, 18, Niagara-on Beth, FEMALE, 17, St. Cat Kathleen, FEMALE, 23, Tim temp

this.persons[b] = temp;

Person[ ]

length 4 [0] [1] [2] [3] persons Steve, MALE, 16, St. Cat Ken, MALE, 18, Niagara-on Beth, FEMALE, 17, St. Cat Kathleen, FEMALE, 23, Tim temp

// After the swap method finishes

Person[ ]

length 4 [0] [1] [2] persons Steve, MALE, 16, St. Cat Ken, MALE, 18, Niagara-on Beth, FEMALE, 17, St. Cat

slide-9
SLIDE 9

10.1.4: Processing All the Elements

public class PersonList extends Object { … persons …

/* Print the name and number of friends for every person in the array. */

public void printBasicInfo() { for(int i = 0; i < this.persons.length; i += 1) { Person p = this.persons[ i ]; System.out.println(p.getName() + " has " + p.getNumFriends + "friends"); } }

/** Calculate the average number of friends */

public double calcAverageNumberOfFriends() { int sumFriends = 0; for( int i = 0; i < this.persons.length; i += 1) { Person p = this.persons[i]; sumFriends = sumFriends + p.getNumFriends(); } return (double) sumFriends / this.persons.length; } }

slide-10
SLIDE 10

10.1.4: Processing All Elements with ForEach

public class PersonList extends Object { … persons …

/** Calculate the average number of friends */

public double calcAverageNumberOfFriends() { int sumFriends = 0; for( int i = 0; i < this.persons.length; i += 1) { Person p = this.persons[i]; sumFriends = sumFriends + p.getNumFriends(); } return (double) sumFriends / this.persons.length; }

/** Calculate the average number of friends using a “foreach loop” */

public double calcAverageNumberOfFriends() { int sumFriends = 0; for( Person p : this.persons ) { sumFriends = sumFriends + p.getNumFriends(); } return (double) sumFriends / this.persons.length; } }

slide-11
SLIDE 11

10.1.5: Processing Matching Elements

for ( each element in the array ) { if ( the element meets some criteria ) { process the element } } public class PersonList extends Object { … persons …

/** Count the number of minors (persons less than 18 years old). */

public int countMinors() { int count = 0; for(int i = 0; i < this.persons.length; i += 1) { if (this.persons[i].getAge() < 18) { count += 1; } } return count; } }

slide-12
SLIDE 12

10.1.6: Searching (1/2) Searching uses some identifying information – name, telephone number, ID number – to find the corresponding object in the array. The identifying information is often called the key. Find the person with ID 107733.

public class PersonList extends Object { … persons … /** Find the person with the given id; null if not found. */ public Person search(int id) { for(int i=0; i<this.persons.length; i+= 1) { Person p = this.persons[i]; if (p.getID() == id) { return p; // success! Return, exiting loop. } } return null; // not found } }

slide-13
SLIDE 13

10.1.6: Searching (2/2) One way of structuring the search is to ask when we’re done:

  • Found the correct element (success!)
  • Reached the end of the list (failure)

public class PersonList extends Object { … persons … /** Find the person with the given id; null if not found. Use a traditional loop */ public Person search2(int id) { int i = 0; while (i < this.persons.length && this.persons[i].getID() != id) { i += 1; } Person answer = null; if (i < this.persons.length) { answer = this.persons[i]; } return answer; } }

slide-14
SLIDE 14

10.1.7: Finding an Extreme Element (1/2) An extreme element has the most of something or the least of

  • something. The most age, the longest time since the last login, the

“smallest” name (first in dictionary order), etc.

remember the first element as the best seen so far for (each remaining element in the array) { if (the current element is better than the best seen so far) { remember the current element as the best seen so far } } return best element seen so far

slide-15
SLIDE 15

10.1.7: Finding an Extreme Element (2/2)

public class PersonList extends Object { … persons … /** Find the youngest person. */ public Person findYoungestPerson() { Person youngestSoFar = this.persons[0]; for(Person currentPerson : this.persons) { if (currentPerson.getAge() < youngestSoFar.getAge()) { youngestSoFar = currentPerson; } } return youngestSoFar; } }

Quick Quiz What does

findYoungestPerson

return for the array shown on the right?

Person[ ]

length 4 [0] [1] [2] [3] persons Steve, MALE, 20, St. Cat Ken, MALE, 18, Niagara Beth, FEMALE, 18, St. Cat Kathleen, FEMALE, 23,

slide-16
SLIDE 16

10.1.8: Sorting an Array (Ideas 1/3) Sorting an array puts all the elements in order by age, name, or some

  • ther criteria.

Selection Sort is one of many algorithms to sort an array. It builds on three patterns we’ve already seen:

  • Process All Elements
  • Find an Extreme
  • Swap Two Elements

We’ll sort the persons array by name.

Person[ ]

length 7 [0] [1] [2] [3] [4] [5] [6] persons Faizel, MALE, 16, St. Ca Doug, MALE, 18, Niagara- Beth, FEMALE, 17, St. Cathy, FEMALE, 23, Tim Greg, MALE, 21, Fonth Ellen, FEMALE, 18, Niaga Ali, MALE, 19, Boston,

F E A G B D C

Person[ ]

length 7 [0] [1] [2] [3] [4] [5] [6] persons Faizel, MALE, 16, St. Cat Doug, MALE, 18, Niagara-on Beth, FEMALE, 17, St. C Cathy, FEMALE, 23, Tim Greg, MALE, 21, Fonth Ellen, FEMALE, 18, Niaga Ali, MALE, 19, Boston, MS

A B C D E F G

slide-17
SLIDE 17

10.1.8: Sorting an Array (Ideas 2/3) Divide the array into the part that’s already sorted (dark background) and the part that isn’t (light background).

1 2 3 4 5 6

A B C G E D F Repeatedly extend the sorted part of the array by:

  • Finding the smallest element in the unsorted part of the array.

1 2 3 4 5 6

A B C G E D F

  • Swapping it with the first element in the unsorted part of the array.

1 2 3 4 5 6

A B C D E G F

  • Extending the sorted part of the array.

1 2 3 4 5 6

A B C D E G F

slide-18
SLIDE 18

10.1.8: Sorting an Array (Ideas 3/3)

for (each position in the array except the last) { find the element that should go in this position swap that element with the element currently there }

1 2 3 4 5 6 The initial, unsorted array. F E A G B D C Find the element that belongs at index 0. F E A G B D C Swap elements at 0 and 2, extending sorted part. A E F G B D C Find the element that belongs at index 1. A E F G B D C Swap elements at 1 and 4, extending sorted part. A B F G E D C Find the element that belongs at index 2. A B F G E D C Swap elements at 2 and 6, extending sorted part. A B C G E D F Find the element that belongs at index 3. A B C G E D F Swap elements at 3 and 5, extending sorted part. A B C D E G F Find the element that belongs at index 4. A B C D E G F Swap elements at 4 and 4, extending sorted part. A B C D E G F Find the element that belongs at index 5. A B C D E G F Swap elements at 5 and 6, extending sorted part. A B C D E F G

slide-19
SLIDE 19

10.1.8: Sorting an Array (Code 1/2)

public class PersonList extends Object { … persons … /** Sort the list of persons in alphabetical order by name. */ public void sort() { for (int firstUnsorted=0; firstUnsorted<this.persons.length-1; firstUnsorted++) { int extremeIndex = this.findExtreme(firstUnsorted); this.swap(firstUnsorted, extremeIndex); } } /** Swap the elements at indices a and b. */ private void swap(int a, int b) { Person temp = this.persons[a]; this.persons[a] = this.persons[b]; this.persons[b] = temp; }

slide-20
SLIDE 20

10.1.8: Sorting an Array (Code 2/2)

/** Find the extreme element in the unsorted portion of the array.

* @param indexToStart the smallest index in the unsorted portion of the array */

private int findExtreme(int indexToStart) { int indexBestSoFar = indexToStart; String nameBestSoFar = this.persons[indexBestSoFar].getName(); for (int i=indexToStart+1; i<this.persons.length; i++) { String currPersonName = this.persons[i].getName(); if (currPersonName.compareTo(nameBestSoFar) < 0) { indexBestSoFar = i; nameBestSoFar = this.persons[i].getName(); } } return indexBestSoFar; } }

slide-21
SLIDE 21

10.1.8: Sorting an Array (Alternate Code)

public class PersonList extends Object { … persons … /** Sort the persons array in increasing order by age */ public void sortByAge() { for (int firstUnsorted=0; firstUnsorted<this.persons.length-1; firstUnsorted++) { // find the youngest unsorted person int extremeIndex = firstUnsorted; for (int i=firstUnsorted + 1; i<this.persons.length; i++) { if (this.persons[i].getAge() < this.persons[extremeIndex].getAge()) { extremeIndex = i; } } // swap the youngest unsorted person with the person at firstUnsorted Person temp = this.persons[extremeIndex]; this.persons[extremeIndex] = this.persons[firstUnsorted]; this.persons[firstUnsorted] = temp; } } }

slide-22
SLIDE 22

10.1.9: Comparing Arrays and Files Arrays Files Store many records? Yes Yes Where is the data? In memory On a disk drive Access speed? Fast Slow Random access? Yes No Cost? More expensive Really cheap When power is off? Information lost Information retained

slide-23
SLIDE 23

10.2: Creating an Array Step 1: Declare the array

persons

Step 2: Allocate space

Person[ ]

length 4 [0] [1] [2] [3] persons

Step 3: Initialize each element

Person[ ]

length 4 [0] [1] [2] [3] persons Steve, MALE, 16, St. Cat Ken, MALE, 18, Niagara-on Beth, FEMALE, 17, St. Cat Kathleen, FEMALE, 23, Tim

slide-24
SLIDE 24

10.2.1: Declaration; 10.2.2 Allocation Declaration

public class PersonList extends Object { private Person[ ] persons;

Allocation

… this.persons = new Person[8];

Decide how large when the program runs:

public class PersonList extends Object { private Person[ ] persons; private void createArray() { Scanner in = new Scanner(System.in); System.out.print("How many persons: "); int numPersons = in.nextInt(); this.persons = new Person[numPersons];

Declaration and allocation can be combined:

private Person[ ] persons = new Person[8];

slide-25
SLIDE 25

10.2.3: Initialization (1/3)

public class PersonList extends Object { private Person[ ] persons = new Person[3]; public PersonList() { super(); this.persons[0] = new Person(10059, "Jacob", Gender.MALE, …); this.persons[1] = new Person(10060, "Emily", Gender.FEMALE, …); this.persons[2] = new Person(10061, "Pat", Gender.FEMALE, …); } }

slide-26
SLIDE 26

10.2.3: Initialization (2/3) If the records are stored in a file…

public class PersonList extends Object { private Person[ ] persons; public PersonList(String fileName) { super(); int count = 0; Scanner in = this.openFile(fileName); while (in.hasNextLine()) { Person p = new Person(in); count++; } in.close();

Count the number of records in the file so we know how much space to allocate for the array.

this.persons = new Person[count];

Allocate the array.

in = this.openFile(fileName); for (int i=0; i<count; i++) { this.persons[i] = new Person(in); } in.close();

Read the data again, creating the objects, and initializing the array with them.

}

slide-27
SLIDE 27

10.2.3: Initialization (3/3)

public class PersonList extends Object { private Person[ ] persons; public PersonList(String fileName) { super(); Scanner in = this.openFile(fileName);

Date file: 3 10005 Joshua MALE … 10007 Ellie FEMALE … 10008 Pat FEMALE …

int count = in.nextInt(); in.nextLine();

Find out how many records.

this.persons = new Person[count];

Allocate the array.

for (int i=0; i<count; i++) { this.persons[i] = new Person(in); } in.close();

Read the data again, creating the objects, and initializing the array with them.

}

slide-28
SLIDE 28

10.3: Passing and Returning Arrays (1/4) Suppose we want all the persons who live in a particular city, such as

  • St. Catharines.

public class PersonList extends Object { private Person[ ] persons; public Person[ ] extractSubset(String city) { size = count number of elements in the subset subset = a new array to store size elements fill subset with the appropriate objects return subset } }

Usage:

Person[ ] stCath = pList.extractSubset("St. Catharines"); System.out.println("There are " + stCath.length + " people living in St. Catharines"); for (Person p : stCath) { System.out.println(p); }

slide-29
SLIDE 29

10.3: Passing and Returning Arrays (2/4)

public class PersonList extends Object { private Person[ ] persons; public Person[ ] extractSubset(String city) { … /* size = count number of elements in the subset subset = a new array to store size elements fill subset with the appropriate objects return subset */ int ssSize = this.countSubset(city); Person[ ] subset = new Person[ssSize]; this.fillSubset(subset, city); return subset; } }

slide-30
SLIDE 30

10.3: Passing and Returning Arrays (3/4)

Person[ ]

length 8 [0] [1] [2] [3] [4] [5] [6] [7] persons Steve, MALE, 16, Niagara Beth, FEMALE, 22, Timmons Kathleen, FEMALE, 22, St. Catharines Roydyn, MALE, 19, Boston Kala, FEMALE, 23, Kitchener Ali, MALE, 19, Niagara Zaki, MALE, 21, St. Catharines Susan, FEMALE, 18, St. Catharines

Person[ ]

length 3 [0] [1] [2] 2 arrPos 1 ssPos ss

slide-31
SLIDE 31

10.3: Passing and Returning Arrays (4/4)

public class PersonList extends Object { private Person[ ] persons; public Person[ ] extractSubset(String city) { … } /** Fill the subset array with Person objects matching the given city

* @param subset The array to fill with elements belonging to the subset. * @param city The city from which all members of the subset come */

private void fillSubset(Person[ ] ss, String city) { int ssPos = 0; // position within the subset int arrPos = 0; // position within the array while (ssPos < ss.length) { Person p = this.persons[arrPos]; if (p.getCity().equalsIgnoreCase(city)) { ss[ssPos] = p; ssPos++; } arrPos++; } } }

slide-32
SLIDE 32

10.4.1: Partially Filled Arrays (1/2) A partially filled array:

  • is an array with two areas, one that has elements in it and one that

does not.

  • has an auxiliary variable to say how many of the elements are

valid.

Person[ ]

length 8 [0] [1] [2] [3] [4] null [5] null [6] null [7] null persons Steve, MALE, 16, St. Cat Ken, MALE, 18, Niagara-on Beth, FEMALE, 17, St. Cat Kathleen, FEMALE, 23, Tim size 4

slide-33
SLIDE 33

10.4.1: Partially Filled Arrays (2/2) Modifying the Process All Pattern:

for (int i = 0; i < this.size; i += 1) { Person p = this.persons[i]; System.out.println(p.getName()); }

Adding a person at the end of a partially filled array:

public void add(Person p) { this.persons[this.size] = p; this.size += 1; }

Quick Quiz You can’t add elements to a partially filled array indefinitely. Eventually, it will fill up. Modify add so that it will detect when the array is full and print an error message instead of adding the element.

slide-34
SLIDE 34

10.4.1: Inserting into a Sorted Array

Person[ ]

length 8 [0] [1] [2] [3] [4] null [5] null [6] null [7] null persons Amy Beth Ken Steve size 4 p Kathy

Original, sorted array.

Person[ ]

length 8 [0] [1] [2] [3] [4] [5] null [6] null [7] null persons Amy Beth Ken Steve size 4 p Kathy

Make a “hole” for the new element.

Person[ ]

length 8 [0] [1] [2] [3] [4] [5] null [6] null [7] null persons Amy Beth Ken Steve size 5 p Kathy

Insert the new element.

slide-35
SLIDE 35

10.4.2: Resizing Arrays (1/4) We can also add an element to an array with the following four steps:

Person[ ]

length 4 [0] [1] [2] [3] persons Ken Steve Amy Beth p Kathy

Person[ ]

length 5 [0] null [1] null [2] null [3] null [4] null larger

Step 1: Allocate a new, larger array.

Person[ ]

length 4 [0] [1] [2] [3] persons Ken Steve Amy Beth p Kathy larger

Person[ ]

length 5 [0] [1] [2] [3] [4] null

Step 2: Copy the contents of the

  • ld array to the larger array.
slide-36
SLIDE 36

10.4.2: Resizing Arrays (2/4)

Person[ ]

length 4 [0] [1] [2] [3] persons Ken Steve Amy Beth p Kathy

Person[ ]

length 5 [0] [1] [2] [3] [4] null larger

Step 3: Reassign the array reference (allowing the old array to be garbage collected).

persons Ken Steve Amy Beth p Kathy

Person[ ]

length 5 [0] [1] [2] [3] [4] larger

Step 4: Add the new element.

slide-37
SLIDE 37

10.4.2: Resizing Arrays (3/4)

public class PersonList extends Object { private Person[ ] persons; public void add(Person p) { // Step 1: Allocate a larger array. Person[ ] larger = new Person[this.persons.length + 1]; // Step 2: Copy element from the old array to the new, larger array. for (int i = 0; i < this.persons.length; i += 1) { larger[i] = this.persons[i]; } // Step 3: Reassign the array reference. this.person = larger; // Step 4: Add the new element. this.persons[this.persons.length-1] = p; } }

slide-38
SLIDE 38

10.4.2: Resizing an Array (4/4)

Insertions Grow PFA 10,000 0.4 0.000 20,000 1.8 0.000 30,000 6.1 0.000 40,000 14.2 0.015 50,000 28.4 0.015 60,000 46.8 0.015 70,000 78.3 0.015 80,000 123.3 0.015 90,000 179.8 0.015 100,000 239.2 0.015 110,000 304.4 0.015 120,000 389.6 0.015 130,000 476.8 0.015 140,000 623.7 0.015 150,000 779.8 0.015

100 200 300 400 500 600 700 800 1 2 3 4 5 6 7 8 9 1 1 1 1 2 1 3 1 4 1 5

Insertions (1,000's)

Seconds

Comparing the time (in seconds) to insert 150,000 elements into an array that grows vs. inserting the same elements into a sufficiently large partially filled array.

slide-39
SLIDE 39

10.4.3: Combining Approaches (1/2)

public class PersonList extends Object { private Person[ ] persons; private int size = 0; public void add(Person p) { if (this.persons.length == this.size) { // The array is full – grow it. Person[ ] larger = new Person[this.persons.length * 2]; for (int i = 0; i < this.persons.length; i += 1) { larger[i] = this.persons[i]; } this.person = larger; } // Add the new element to the end of the array and increase the size. this.persons[this.size] = p; this.size += 1; } }

slide-40
SLIDE 40

10.4.3: Combining Approaches (2/2) Good Bad Partially Filled Arrays

  • Allows add & delete.
  • Fast.
  • Fixed maximum size.
  • Wasted space if a large

array is sometimes needed. Growing Arrays

  • Allows add & delete.
  • No wasted space.
  • No maximum size

(other than that imposed by the computer).

  • Too much time to

insert many elements. Combined Approach

  • Allows add & delete.
  • No maximum size.
  • Less wasted space.
  • Fast
  • Some wasted space.
slide-41
SLIDE 41

10.5: Arrays of Primitive Types Java also allows arrays of int, double,

boolean, etc.

For example, each MySpace Person object has a list of the ID numbers of their friends.

public class Person extends Object { private String name; … private int[ ] friendIDs; // Declare public Person(Scanner in) { … // Allocate int numFriends = in.nextInt(); this.friendIDs = new int[numFriends]; // Initialize for(int i=0; i<numFriends; i+= 1) { this.friendIDs[i] = in.nextInt(); } } }

Person

  • String name
  • int id
  • Gender gender
  • int age
  • String city
  • String province
  • String country
  • DateTime lastLogon
  • int[ ] friendIDs

+Person(Scanner in) +String getName( ) +int getID( ) +Gender getGender( )

+int[ ] getFriendIDs( )

...

slide-42
SLIDE 42

Case Study 1: # of Friends in Common (1/2) Write a method that returns the number of friends that two people have in common.

public class Person extends Object { private final int id; private final String name; … private int[ ] friendIDs; // Filled array. public int numFriendsInCommon(Person other) { int inCommon = 0; for (each friend in my list) { if (my friend is also a friend of other) { inCommon += 1; } } return inCommon; } }

slide-43
SLIDE 43

Case Study 1: # of Friends in Common (2/2)

public class Person extends Object { private int[ ] friendIDs; // Filled array. …

/** Return the number of friends other has in common with this person. */

public int numFriendsInCommon(Person other) { int inCommon = 0; for (int i = 0; i < this.friendIDs.length; i += 1) { int myFriend = this.friendIDs[ i ]; if (other.hasFriend(myFriend)) { inCommon += 1; } } return inCommon; } /** Return true if personID appears in the list of this person's friends; false otherwise. */ private boolean hasFriend(int personID) { for (int i = 0; i < this.friendIDs.length; i += 1) { if (this.friendIDs[ i ] == personID) { return true; } } return false; }

slide-44
SLIDE 44

Case Study 2: Distribution of Friends (1/2) Suppose you wanted to know the distribution of friends – how many people have 0 friends, how many have one friend, two friends, etc. Such information could be used to make a bar chart such as the following:

100 200 300 400 500 1 5 9 13 17 21 25 29 33 37 Number of Friends Number of People

slide-45
SLIDE 45

Case Study 2: Distribution of Friends (2/2)

public class PersonList extends Object { private Person[ ] persons; … public int[ ] friendDistribution() { int[ ] numFriends = new int[100]; for(Person p : this.persons) { if (p.getNumFriends() < numFriends.length) { numFriends[p.getNumFriends()] += 1; } else { // grow the array instead?!? throw new Error(p.getName() + “ has too many friends (" + p.getNumFriends() + ")."); } } return numFriends; } }

Usage:

int[ ] friendDist = pList.friendDistribution(); for(int i=0; i<friendDist.length; i++) { System.out.println((friendDist[i] + " people have " + i + " friends."); }

slide-46
SLIDE 46

10.6: Multi-Dimensional Arrays (1/2) United Way Corporate Donations Individual Donations Fund- raising Govt. Grants Jan 3,000 6,915 15,500 Feb 2,125 4,606 5,500 Mar 2,000 5,448 5,500 Apr 3,000 4,833 13,983 15,500 May 20,569 2,000 6,091 5,500 Jun 8,000 4,867 5,500 Jul 3,000 4,196 15,500 Aug 2,550 4,736 5,500 Sep 2,000 4,305 5,500 Oct 3,000 5,286 32,254 15,500 Nov 2,000 6,834 5,500 Dec 9,351 2,000 7,459 5,500

int[ ][ ] income = new int[12][5];

slide-47
SLIDE 47

10.6: Multi-Dimensional Arrays (2/2)

int[ ][ ]

income 1 2 3 4 5 6 7 8 9 10 11 1 2 3 4 3,000 6,915 15,500 2,125 4,606 5,500 2,000 5,448 5,500 3,000 4,833 13,983 15,500 20,569 2,000 6,091 5,500 8,000 4,867 5,500 3,000 4,196 15,500 2,550 4,736 5,500 2,000 4,305 5,500 3,000 5,286 32,254 15,500 2,000 6,834 5,500 9,351 2,000 7,459 5,500

income[4][1] += 1000;

slide-48
SLIDE 48

10.6.1: 2D Array Algorithms (1/3) Printing Every Element

for ( each row in the array ) { for ( each column in the row ) { print the data at the intersection of the row and column } } public class Income extends Object { private int[ ][ ] income; … /** Print the income chart. */ public void printIncomeChart() { for (int row = 0; row < this.income.length; row += 1) { for (int col = 0; col < this.income[row].length; col += 1) { System.out.print(this.income[row][col] + "\t"); } System.out.println(); } } }

slide-49
SLIDE 49

10.6.1: 2D Array Algorithms (2/3) Sum Every Element

int total = 0; for ( each row in the array ) { for ( each column in the row ) { add the data at the intersection of the row and column to total } } public class Income extends Object { private int[ ][ ] income; … /** Calculate the total income for the year. */ public int getTotalIncome() { int total = 0; for (int row = 0; row < this.income.length; row += 1) { for (int col = 0; col < this.income[row].length; col += 1) { total += this.income[row][col]; } } return total; }

slide-50
SLIDE 50

10.6.1: 2D Array Algorithms (3/3) Summing a Column

int total = 0; for ( each row in the array ) { add the data at intersection of the row and specified column to total } public class Income extends Object { private int[ ][ ] income; … /** Calculate the total income for a given category for the year. */ public int getTotalByCategory(int columnNum) { int total = 0; for (int row = 0; row < this.income.length; row += 1) { total = total + this.income[r][columnNum]; } return total; } }

slide-51
SLIDE 51

10.6.2: Allocating and Initializing a 2D Array

public class Income extends Object { private int[ ][ ] income; … public Income(Scanner in) { super(); // Get the size of the array. int rows = in.nextInt(); int cols = in.nextInt(); in.nextLine(); // Allocate the array. this.income = new int[rows][cols]; // Fill the array. for (int r = 0; r < this.income.length; r++ ) { for (int c = 0; c < this.income[r].length; c++) { this.income[r][c] = in.nextInt(); } in.nextLine(); } } }

Data File

12 5 0 3000 6915 0 15500 0 2125 4606 0 5500 0 2000 5448 0 5500 0 3000 4833 13983 15500 …

slide-52
SLIDE 52

10.6.3: Arrays of Arrays

int[ ][ ]

length 12 [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11]

int[ ]

length 5 [0] [1] 3,000 [2] 4,833 [3] 13,983 [4] 15,500

int[ ]

length 5 [0] [1] 3,000 [2] 6,915 [3] [4] 15,500

int[ ]

length 5 [0] [1] 2,125 [2] 4,606 [3] [4] 5,500

int[ ]

length 5 [0] [1] 2,550 [2] 4,736 [3] [4] 5,500

int[ ]

length 5 [0] 9,351 [1] 2,000 [2] 7,459 [3] [4] 5,500

int[ ]

length 5 [0] [1] 3,000 [2] 4,196 [3] [4] 15,500

int[ ]

length 5 [0] 20,569 [1] 2,000 [2] 6,091 [3] [4] 5,500

int[ ]

length 5 [0] [1] 2,000 [2] 5,448 [3] [4] 5,500 income

int[ ]

length 5 [0] [1] 8,000 [2] 4,867 [3] [4] 5,500

int[ ]

length 5 [0] [1] 3,000 [2] 5,286 [3] 32,254 [4] 15,500

int[ ]

length 5 [0] [1] 2,000 [2] 4,305 [3] [4] 5,500

int[ ]

length 5 [0] [1] 2,000 [2] 6,834 [3] [4] 5,500

slide-53
SLIDE 53

10.7: GUI: Animation (1/4) Showing these images in quick succession will cause the eyes to appear to roll.

  • Already know how to use ImageComponent to get an image from

a file and display it (Section 9.8.2).

  • Put images into an array so we can use an index to display them in

sequence.

  • But…
  • need to sleep for a bit (about 100ms) so the user can see the

current image.

  • need to allow other things to happen (like selecting ‘quit’).

Therefore… use a thread to update the index and call repaint.

slide-54
SLIDE 54

10.7: GUI: Animation (2/4)

import javax.swing.*; import java.awt.*;

/** Instances of AnimateImage show a sequence of images to produce an animation. * * @author Byron Weber Becker */

public class AnimateImage extends JComponent implements Runnable { private int NUM_IMAGES = 6; private ImageIcon[ ] images; private int currentImage = 0; /** Construct a new image animation component, loading all the images. */ public AnimateImage() { super(); // Allocate and initialize array of images this.images = new ImageIcon[NUM_IMAGES]; for (int i=0; i<NUM_IMAGES; i++) { String fileName = "Happy" + i + ".gif"; this.images[i] = new ImageIcon(fileName); } this.setPreferredSize(new Dimension(this.images[0].getIconWidth(), this.images[0].getIconHeight())); }

slide-55
SLIDE 55

10.7: GUI: Animation (3/4)

/** Paint the current image on the screen. */ public void paintComponent(Graphics g) { super.paintComponent(g); Image img = this.images[this.currentImage].getImage(); g.drawImage(img, 0, 0, null); } /** Run the animation. */ public void run() { while (true) { // Advance to the next image in the sequence. this.currentImage = (this.currentImage + 1) % this.images.length; this.repaint(); try { // Give the user a chance to see the image. Thread.sleep(100); } catch (InterruptedException ex) {// ignore } } } }

slide-56
SLIDE 56

10.7: GUI: Animation (4/4)

import javax.swing.*;

public class Main extends Object { public static void main(String[ ] args) { // Create two animated components. AnimateImage anim1 = new AnimateImage(); AnimateImage anim2 = new AnimateImage(); // Put the components in a panel and then in a frame. JPanel contents = new JPanel(); contents.add(anim1); contents.add(anim2); JFrame f = new JFrame("Animations"); f.setContentPane(contents); f.pack(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); // Run each animation in its own thread. Thread t1 = new Thread(anim1); t1.start(); Thread t2 = new Thread(anim2); t2.start(); }

Parameterize for increased flexibility (image name, # of images, speed, direction through the array, length of time to run, etc.).

slide-57
SLIDE 57

10.8.1: The Process All Elements Pattern Name: Process All Elements Context: You have a collection of values stored in an array and need to perform the same operation on all of them. Solution: Use a for loop to process each element of the array, one element with each iteration of the loop.

for(int «index» = 0; «index» < «arrayName».length; «index» += 1) { «elementType» «elementName» = «arrayName»[«index»]; «statements to process the element» }

The foreach loop is somewhat more concise when the index is not needed for processing:

for(«elementType» «elementName» : «arrayName») { «statements to process the element» }

Consequences: Each element in the array is processed. A variation of this pattern must be used for partially filled arrays. Related Patterns: Many patterns are specializations of this pattern. For example, Process Matching Elements, Find and Extreme, etc.

slide-58
SLIDE 58

10.8.2: The Linear Search Pattern (v1) Name: Linear Search (version 1) Context: You want to find one element in an array, based on an identifying key. Solution: Step through the elements of the array, breaking out of the loop when the element is found. This assumes a partially filled array.

public «typeOfElement» «methodName»(«type» «criteria») { for (int i = 0; i < «auxVar»; i += 1) { «typeOfElement» «elem» = «arrayName»[ i ]; if («elem» satisfies «criteria») { return «elem»; } } return «failureValue»; }

Consequences: If the element is found, it is returned; otherwise a designated value such as null is returned. Related Patterns: An alternate pattern avoids the early return out of the for loop. There are many variations for returning the value, a Boolean, the element index, etc.

slide-59
SLIDE 59

10.8.2: The Linear Search Pattern (v2) Name: Linear Search (version 2) Context: You want to find one element in an array, based on an identifying key. Solution:

public «typeOfElement» «methodName»(«type» «criteria») { int i = 0; while (i < «auxVar» && ! («arrayName»[ i ] satisfies «criteria»)) { i += 1; } if (i == «auxVar») { return «failureValue»; } else { return «arrayName»[ i ]; } }

The while loop’s test depends on short-circuit evaluation. Consequences: If the element is found, it is returned; otherwise a designated value such as null is returned. Related Patterns: There are many variations for returning the value, a Boolean, the element index, etc.

slide-60
SLIDE 60

Concept Map

arrays hold multiple values indices are referenced with meaningful sequence numbers a r e s

  • m

e

  • t

i m e s are usually multiple dimensions m a y h a v e m a y b e allocating space find an extreme partially filled arrays auxilliary variable track filled elements with an change size may be reallocated to algorithms h a v e a d d i t i

  • n

a l insert such as prepared for use m u s t b e declaring variables initializing elements first by s e c

  • n

d b y third by process all elements algorithms are processed with such as such as sort such as delete such as type each have the same

slide-61
SLIDE 61

Summary We have learned:

  • that an array stores many elements accessed with an integer index.
  • how to access individual values.
  • how to process all the elements of the array, including variations to

process only selected elements, find an extreme, and sort the array.

  • how to declare, allocate, and initialize an array.
  • that array references can be passed as arguments and returned from

methods.

  • how to store collections that grow and shrink using partially filled

arrays, arrays that are reallocated, and a combination of the two methods.

  • that arrays may store primitive types.
  • that sometimes the indices have meaning within the problem.
  • how to declare and use multi-dimensional arrays.
  • how to animate an array of images.