SD2054 Software Development. The Limitation of Arrays Once an array is created it must be sized, and...

Post on 30-Mar-2015

220 views 2 download

Tags:

Transcript of SD2054 Software Development. The Limitation of Arrays Once an array is created it must be sized, and...

SD2054

Software Development

The Limitation of Arrays

Once an array is created it must be sized, and this size is fixed!

The Limitation of Arrays

An array contains no useful pre-defined methods!

The Limitation of Arrays

Use the classes provided in the Java Collections Framework!

By the end of this lecture you should be able to:

• use the ArrayList class to store a list of objects;

• use the HashSet class to store a set of objects

• use the HashMap class to store objects in a map;

• fix the type of elements within a collection using the generics mechanism;

• use objects of your own classes in conjunction with Java's collection classes.

The Java Collections Framework

The classes in the JCF are all found in the java.util package.

import java.util.*

Three important interfaces from this group are:

List Set Map

The List interface

The List interface specifies the methods required to process an ordered list of objects.

Such a list may contain duplicates.

The List interface

Two implementations provided :

ArrayList & LinkedList

Using an ArrayList to store a queue of jobs waiting for a printer

The ArrayList constructor creates an empty list:

ArrayList printQ = new ArrayList();

The ArrayList constructor creates an empty list:

ArrayList<String> printQ = new ArrayList<String>();

What’s that stuff in angled brackets?

It’s a new Java feature called generics!

The ArrayList constructor creates an empty list:

ArrayList<String> printQ = new ArrayList<String>();

Use the interface type instead of the implementation type!

ArrayList<String> printQ = new ArrayList<String>();List<String> printQ = new ArrayList<String>();

A method that receives a printQ object, would now be declared as follows

public void someMethod (List<String> printQIn){

// some code here}

List<String> printQ = new ArrayList<String>();

A method that receives a printQ object, would now be declared as follows

public void someMethod (List<String> printQIn){

// some code here}

List<String> printQ = new HashList<String>();

A method that receives a printQ object, would now be declared as follows

public void someMethod (List<String> printQIn){

// some code here}

List methods - add

printQ.add("myLetter.doc");

myLetter.doc

printQ

printQ.add("myFoto.jpg");

printQ.add("results.xls");

printQ.add("chapter.doc");

myFoto.jpg results.xls chapter.doc

0 1 2 3

List methods - toString

All the Java collection types have a toString method defined

System.out.println(printQ);

Lists are displayed as follows.

[myLetter.doc, myFoto.jpg, results.xls, chapter.doc]

List methods – add revisited

printQ.add(0, "importantMemo.doc");

printQ

myLetter.doc myFoto.jpg results.xls chapter.doc

importantMemo.doc

0 1 2 30 1 2 3 4

List methods – set

myLetter.doc myFoto.jpg results.xls chapter.docimportantMemo.doc

printQ.set(4, "newChapter.doc");

newChapter.doc

printQ

0 1 2 3 4

List methods – size

printQ.set(printQ.size()-1, "newChapter.doc");

myLetter.doc myFoto.jpg results.xls chapter.docimportantMemo.doc newChapter.doc

printQ

0 1 2 3 4

List methods – indexOf

Example: finding “myFoto.jpg”

int index = printQ.indexOf("myFoto.jpg"); if (index != -1) { System.out.println("myFoto.jpg is at index position: " + index); }else { System.out.println("myFoto.jpg not in list");}

List methods – remove

Example : removing "myFoto.jpg"

myFoto.jpgmyLetter.docimportantMemo.doc results.xls chapter.docnewChapter.doc

printQ

printQ.remove(2);

printQ.remove("myFoto.jpg");

0 1 2 3 42 3

List methods – get

System.out.println("First job is " + printQ.get(0));

myLetter.doc myFoto.jpg results.xls chapter.docimportantMemo.doc newChapter.doc

printQ

First job is importantMemo.doc

0 1 2 3 4

List methods – contains

if (printQ.contains(“poem.doc”))

{

System.out.println(“poem.doc is in the list”);

}

else

{

System.out.println(“poem.doc is not in the list”);

}

Using the enhanced ‘for’ loop with collection classes

Example:

Iterating through the printQ list to find and display those jobs that end with a “.doc” extension:

for (String item: printQ) { if (item.endsWith(".doc")) {

System.out.println(item); }}

The Set interface

The Set interface defines the methods required to process a collection of objects in which there is no repetition, and ordering is unimportant.

Which of these are sets?

a queue of people waiting to see a doctor:

Which of these are sets?

a list of number one records for each of the 52 weeks of a particular year :

Which of these are sets?

car registration numbers allocated parking permits.

AK346NYQC771OD

AZ885JL

There are 2 implementations provided for the Set interface in the JCF.

They are HashSet and TreeSet.

Using a HashSet to store a collection of vehicle registration numbers

AK346NYQC771OD

AZ885JL

The constructor creates an empty set:

Set<String> regNums = new HashSet<String>();

Set<String> regNums = new HashSet<String>();

Remember: use the interface type!

The constructor creates an empty set:

Set<String> regNums = new HashSet<String>();

Remember: use generics!

The constructor creates an empty set:

Set methods - add

The add method allows us to insert objects into the set

regNums.add(“V53PLS”);

regNums.add(“X85ADZ”);

regNums.add(“L22SBG”);

regNums.add(“W79TRV”);

Set methods - toString

We can display the entire set as follows:

System.out.println(regNums);

The set is displayed in the same format as a list:

[W79TRV, X85ADZ, V53PLS, L22SBG]

Set methods - size

As with a list, the size method returns the number of items in the set

System.out.println(“Number of items in set: ” + regNums.size() );

Set methods - remove

The remove method deletes an item from the set if it is present.

regNums.remove(“X85ADZ”);

If we now display the set, the given registration will have been removed:

[W79TRV, V53PLS, L22SBG]

Set interface also includes contains & isEmpty methods

Using the enhanced ‘for’ loop to iterate through a set

The following enhanced for loop will allow us to iterate through the registration numbers and display all registrations after ‘T’.

for (String item: regNums) { if (item.charAt(0)> 'T') { System.out.println(item); }}

[W79TRV, V53PLS, L22SBG]W79TRVV53PLS

Iterator objects

An Iterator object allows the items in a collection to be retrieved by providing three methods defined in the Iterator interface:

Methods of the Iterator interface

Method Description Inputs Outputs

hasNext Returns true if there are more elements in the collection to retrieve and false otherwise.

None An item of type boolean.

next Retrieves one element from the collection.

None An item of the given element type.

remove Removes from the collection the element that is currently retrieved

None None

To obtain an Iterator object from a set, call the iterator method..

Iterator<String> elements = regNums.iterator();

Using an Iterator object with a 'while' loop..

The following removes all registration prior to and including 'T'

Iterator<String> elements = regNums.iterator();

while (elements.hasNext())

{

String item = elements.next();

if (item.charAt(0)<= 'T')

{

elements.remove();

}

}

The Map interface

The Map interface defines the methods required to process a collection consisting of pairs of objects (keys and values).

“00165328670”

BookISBN

The Map interface

The Map interface defines the methods required to process a collection consisting of pairs of objects (keys and values).

“NH03456”

PatientNHS number

The Map interface

There are two implementations provided for the Map interface.

They are HashMap and TreeMap

Using a HashMap to store a collection of user names and passwords

username passwordLauraHaliwell monkey

SunaGuven television

BobbyMann elephant

LucyLane monkey

BernardAnderson velvet

The constructor creates the empty map:

Map<String, String> users;

users = new HashMap<String, String>( );

The constructor creates the empty map:

Map<String, String> users;

users = new HashMap<String, String>( );

Remember: use the interface type!

The constructor creates the empty map:

Map<String, String> users;

users = new HashMap<String, String>( );

Remember: use generics!

The constructor creates the empty map:

Map<String, String> users;

users = new HashMap<String, String>( );

KEY type

The constructor creates the empty map:

Map<String, String> users;

users = new HashMap<String, String>( );

VALUE type

Map methods - put

users.put(“LauraHaliwell", “monkey");

users

“ LauraHaliwell " “monkey"

Map methods - put

users.put(“LauraHaliwell", “popcorn");

users

“ LauraHaliwell " “monkey"“popcorn"

users.put(“CharlieSheen", “crazy");

users

“ LauraHaliwell " “popcorn"

Map methods - put

“ CharlieSheen " “crazy"

Map methods - containsKey

The containsKey method accepts an object and returns true if the object is a key in the map and false otherwise:

if (users.containsKey(“LauraHaliwell")) { System.out.println(“user ID already taken”);}

There is also a containsValue method to check for the presence of a value in a map.

Map methods - get

String password = users.get(“LauraHaliwell);

if (password != null)

{

// valid key

}

else // no such user

{

System.out.println ("INVALID USERNAME!");

}

Map methods - toString

Maps are displayed in the following output:

{LauraHaliwell=popcorn,

CharlieSheen=crazy,

BobbyMann=elephant}

Map methods - remove

The remove method accepts a key value and, if the key is present in the map, both the key and value pair are removed:

users.remove(“LauraHaliwell");

Displaying the map now shows the user’s ID and password have been removed:

{CharlieSheen=crazy, BobbyMann=elephant }

Iterating over the elements of a map

In order to scan the items in the map, the keySet method can be used to return the set of keys.

Set<String> theKeys = users.keySet();

The set of keys can then be processed in the ways discussed previously for sets.

Using your own classes with Java’s collection classes

The constructor creates an empty set:

Set<Book> books = new HashSet<Book>();

When storing user-defined objects in any of the JCF collections, these objects should have three specific methods defined:

• toString• equals• hashCode

Defining a toString method

Here is one possible toString method we could provide for our Book class:

public String toString() { return "(" + isbn +", "+ author + ", " + title +")\n"; }

Defining an equals method

One possible interpretation of two books being equal is simply that their ISBNs are equal, so the following equals method could be added to the Book class:

public boolean equals (Object objIn) {

}

Book bookIn = objIn; Wrong type!

Defining an equals method

public boolean equals (Object objIn) {

}

Book bookIn = (Book) objIn; return isbn.equals(bookIn.isbn);

One possible interpretation of two books being equal is simply that their ISBNs are equal, so the following equals method could be added to the Book class:

The hashCode method

The hashCode method returns an integer value from an object.

What number can I generate from a book?

The hashCode method

The hashCode method returns an integer value from an object.

How about using the number of pages!

The hashCode method

The hashCode method returns an integer value from an object.

212

The hashCode method

The hashCode method returns an integer value from an object.

OK, what’s the point of this number?

The hashCode method

The hashCode method returns an integer value from an object.

The number makes it quicker to find items!

The hashCode method

The hashCode method

212

244244

The hashCode method

All of Java’s predefined classes (such as String) have a meaningful hashCode method defined.

For Book equality we check the ISBN only.

This ISBN is a String, so all we need to do is to return the hashCode number of this String:

The hashCode method

public int hashCode(){

return isbn.hashCode();}