1 chapter 10 l vector l linked data structures l interface dynamic data structures

45
Chapter 10 Vector Linked Data Structures interface Dynamic Data Structures

Post on 21-Dec-2015

222 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: 1 Chapter 10 l Vector l Linked Data Structures l interface Dynamic Data Structures

1

Chapter 10

Vector Linked Data Structures interface

Dynamic Data Structures

Page 2: 1 Chapter 10 l Vector l Linked Data Structures l interface Dynamic Data Structures

2

Overview This chapter is about data structures that are

dynamic:» They can grow and shrink while your program is

running Vectors are similar to arrays but are moreflexible. Linked lists are a dynamic data structure commonly

used in many programming languages.

Page 3: 1 Chapter 10 l Vector l Linked Data Structures l interface Dynamic Data Structures

3

Vectors"Well, I'll eat it," said Alice, "and if it makes me grow

larger, I can reach the key; and if it makes me grow smaller, I can creep under the door; so either way I'll get into the garden…"

Lewis Carroll, Alice's Adventures in Wonderland

VECTORS

Think of them as arrays that can get larger or smaller

when a program is running.

Page 4: 1 Chapter 10 l Vector l Linked Data Structures l interface Dynamic Data Structures

4

Arrays Versus VectorsArraysBad: Size is fixed when declared Inefficient storage: can use a

partially full array, but space has been allocated for the full size

If one more value needs to be added past the maximum size the array needs to be redeclared

Good: More efficient (faster)

execution Allows primitive type

elements

VectorsGood : Size is not fixed Better storage efficiency: a

partially full vector may be allocated just the space it needs

If one more value needs to be added past the maximum size the vector size increases automatically

Bad: Less efficient (slower)

execution Elements must be class types

(primitive types not allowed)

Page 5: 1 Chapter 10 l Vector l Linked Data Structures l interface Dynamic Data Structures

5

Using Vectors Vectors are not automatically part of Java

» they are in the util library» you must import java.util.*

Create a vector with an initial size of 20 elements:Vector v = new Vector(20);

Page 6: 1 Chapter 10 l Vector l Linked Data Structures l interface Dynamic Data Structures

6

Initial Capacity and Efficiency:

a Classic Engineering Tradeoff

Engineering involves making difficult tradeoffs» "There's no such thing as a free lunch."

– an American saying

» Usually, if you gain something you lose something somewhere else

Choosing the initial size of a vector is an example of a tradeoff» making it too large wastes allocated memory space» making it too small slows execution

– it takes time to resize vectors dynamically Solution?

» optimize one at the expense of the other» or make good compromises

– choose a size that is not too big and not too small

Page 7: 1 Chapter 10 l Vector l Linked Data Structures l interface Dynamic Data Structures

7

Vector Syntax

Array: a is a String array

a[i] = "Hi, Mom!";

String temp = a[i];

Vector: v is a vector

v.setElementAt("Hi, Mom!", i);

String temp = (String)v.elementAt(i);

Instead of the index in brackets and = for assignment, use vector method setElementAt with two arguments, the value and the index

Use vector method elementAt(int index) to retrieve the value of an element

Note: the cast to String is required because the base type of vector elements is Object

The idea is the same as for arrays, but the syntax is different As with arrays, the index must be in the range 0 to size-of-the-

vector

Page 8: 1 Chapter 10 l Vector l Linked Data Structures l interface Dynamic Data Structures

8

Vector Methods The vector class includes many useful methods:

» constructors» array-like methods, e.g. setElementAt & elementAt

» methods to add elements» methods to remove elements» search methods» methods to work with the vector's size and capacity,

e.g. to find its size and check if it is empty» a clone method to copy a vector

See the text for more information

Page 9: 1 Chapter 10 l Vector l Linked Data Structures l interface Dynamic Data Structures

9

A little Detail about setElementAt

Vectors put values in successive indexes» addElement is used to put initial values in a vector» new values can be added only at the next higher index

You cannot use setElemetAt to put a value at any index» setElemetAt can be used to assign the value of an

indexed variable only if it has been previously assigned a value with addElement

Page 10: 1 Chapter 10 l Vector l Linked Data Structures l interface Dynamic Data Structures

10

Base Type of Vectors The base type of an array is specified when the array is

declared» all elements of arrays must be of the same type

The base type of a vector is Object» elements of a vector can be of any class type» in fact, elements of a vector can be of different class types!» to store primitive types in a vector they must be converted

to a corresponding wrapper classGood Programming PracticeAlthough vectors allow elements in the same vector to be of

different class types, it is best not to have a mix of classes in the same vector -

– it is best to have all elements in a vector be the same class type.

Page 11: 1 Chapter 10 l Vector l Linked Data Structures l interface Dynamic Data Structures

11

The following code looks very reasonable but will produce an error saying that the class Object does not have a method named length:

Vector v = new Vector()String greeting = "Hi, Mom!";v.addElement(greeting);System.out.println("Length is " + (v.elementAt(0)).length());

String, of course, does have a length method, but Java sees the type of v.elementAt(0) as Object, not String

Solution? Cast v.elementAt(0) to String:System.out.println ("Length is " + ((String)v.elementAt(0)).length());

Detail: One Consequence of the Base Type of Vectors

Being Object

Page 12: 1 Chapter 10 l Vector l Linked Data Structures l interface Dynamic Data Structures

12

One More Detail:Size Versus Capacity

Be sure to understand the difference between capacity and size of a vector:» capacity is the declared size of the vector

– the current maximum number of elements» size is the actual number of elements being used

-- the number of elements that contain valid values,

not garbage

-- remember that vectors add values only in

successive indexes Loops that read vector elements should be limited by the

value of size, not capacity, to avoid reading garbage values

Page 13: 1 Chapter 10 l Vector l Linked Data Structures l interface Dynamic Data Structures

13

Programming Tip: Increasing Storage Efficiency of Vectors

A vector automatically increases its size if elements beyond its current capacity are added

But a vector does not automatically decrease its size if elements are deleted

The method trimSize shrinks the capacity of a vector to its current size so there is no extra, wasted space» the allocated space is reduced to whatever is

currently being used

To use storage more efficiently, use trimSize when a vector will not need its extra capacity later

Page 14: 1 Chapter 10 l Vector l Linked Data Structures l interface Dynamic Data Structures

14

The method clone is used to make a copy of a vector but its return type is Object, not Vector» of course you want it to be Vector, not Object

So, what do you do?» Cast it to VectorVector v = new Vector(10);Vector otherV;otherV = vector;Vector otherV = (Vector)v.clone();

And Another Detail: Correcting the

Return Type of clone

This just makes otherV another name for the vector v (there is only one copy of the vector and it now has two names)

This creates a second copy of v with a different name, otherV

Page 15: 1 Chapter 10 l Vector l Linked Data Structures l interface Dynamic Data Structures

15

And Yet Another Detail:Protecting Private Variables

Just as with arrays, be careful not to return addresses of private vector variables, otherwise calling methods can access them directly» "Information Hiding" is compromised

To protect against it, return a copy of the vector» use clone as described in the previous slide

But that's not all:» if the elements of the vector are class (and not

primitive) types, they may not have been written to pass a copy

» they may pass the address» so additional work may be required to fix the

accessor methods

Page 16: 1 Chapter 10 l Vector l Linked Data Structures l interface Dynamic Data Structures

16

Linked Lists

“Math"

"and"

“Psy"

head“CS"

One node in the list

Data in a node

A link in a node

Null link signifying the end of the list

null

Linked lists consists of objects known as nodes

Each node has a place for data and a link to another node

Links are shown as arrows

Each node is an object of a class that has two instance variables: one for the data and one for the link

The head of the list is not a node.

Page 17: 1 Chapter 10 l Vector l Linked Data Structures l interface Dynamic Data Structures

17

ListNode Class:Instance Variables and

Constructor

public class ListNode{ private String data; private ListNode link;

public ListNode(String newData, ListNode linkValue) { data = newData; link = linkValue; }

Two parameters for the constructor: data value for the new node Link value for the new node

“CS"

Page 18: 1 Chapter 10 l Vector l Linked Data Structures l interface Dynamic Data Structures

18

Start at beginning of list

Stepping through a List

“Math"

"and"

“Psy"

head“CS"

When position is at this last node, position.getLink() is null and the loop will terminate.

null

ListNode position;position = head;while (position != null){ ... position = position.getLink();}

position

This reference is position.getLink().

Moves to next node in the list.

Excerpt from showList in StringLinkedList

Page 19: 1 Chapter 10 l Vector l Linked Data Structures l interface Dynamic Data Structures

19

Adding a NodeTo add a node at the beginning of the list:

public void addANodeToStart(String addData)

{

head = new ListNode(addData, head);

} The new node will point to the old start of the list,

which is what head pointed to. The value of head is changed to point to the new

node, which is now the first node in the list.

Page 20: 1 Chapter 10 l Vector l Linked Data Structures l interface Dynamic Data Structures

20

Deleting a NodeTo delete a node from the beginning of the list:public void deleteHeadNode(){ if (head != null) { head = head.getLink(); } else // prints an error message and exits ... Doesn't try to delete from an empty list. Removes first element and sets head to point to the node

that was second but is now first.

Page 21: 1 Chapter 10 l Vector l Linked Data Structures l interface Dynamic Data Structures

21

Node Inner Classes

Using an inner class makes StringLinkedList self-contained because it doesn't depend on a separate file

Making the inner class private makes it safer from the point of view of information hiding

public class StringLinkedList{ private ListNode head; <methods for StringLinkedList inserted here> private class ListNode { <Define ListNode instance variables and methods here> }}

Page 22: 1 Chapter 10 l Vector l Linked Data Structures l interface Dynamic Data Structures

22

An object that allows a program to step through a collection of objects and do some action on each one is called an iterator.

For arrays, an index variable can be used as an iterator, with the action of going to the next thing in the list being something like:index++;

In a linked list, a reference to the first node can be used as an iterator

StringLinkedListSelfContained has an instance variable called current that is used keep track of where the iteration is.

The goToNext method moves to the next node in the list by using the statement:current = current.next;

Iterators

Page 23: 1 Chapter 10 l Vector l Linked Data Structures l interface Dynamic Data Structures

23

goToNext

“Math"

"and"

“Psy"

head“CS"

null

previous

current

“Math"

"and"

“Psy"

head“CS"

null

previous

current

current.link

current = current.link gives current a reference to this node

Before After

Page 24: 1 Chapter 10 l Vector l Linked Data Structures l interface Dynamic Data Structures

24

Other Methods in the Linked List with Iterator

getDataAtCurrent—returns the data part of the node that the iterator (current) is at

moreToIterate—returns a boolean value that will be true if the iterator is not at the end of the list

resetIteration—moves the iterator to the beginning of the list

Can write methods to add and delete nodes at the iterator instead of only at the head of the list.» Following slides show diagrams illustrating the add and

delete methods.

Page 25: 1 Chapter 10 l Vector l Linked Data Structures l interface Dynamic Data Structures

25

Adding a NodeStep 1

“Math"

"and"

head“CS"

“Psy"null

newNode

current

Before

"Cheatem"

"and"

head"Duey"

"Howe"null

newNode

current

After

Create the node with reference newNodeAdd data to the nodenewNode.link = current.link

null

Page 26: 1 Chapter 10 l Vector l Linked Data Structures l interface Dynamic Data Structures

26

Adding a NodeStep 2

“Math"

"and"

head“CS"

“Psy"null

newNode

current

After

current.link = newNode.linkThe node has been added to the list although it might appear out of place in this diagram.

“Math"

"and"

head“CS"

“Psy"null

newNode

current

Before

Page 27: 1 Chapter 10 l Vector l Linked Data Structures l interface Dynamic Data Structures

27

After creating the node, the two statements used to add the node to the list are:

newNode.link = current.link;

current.link = newNode;

What would happen if these two steps were done in reverse order?

Adding a Node

Page 28: 1 Chapter 10 l Vector l Linked Data Structures l interface Dynamic Data Structures

28

Deleting a NodeStep 1

“Math"

previous“CS"

current

Before

“Math"

previous“CS"

“Psy"null

“Psy"null

newNode

current

After

previous.link = current.linkWhat should be done next?

"and" "and"This node will be removed from the list.

Page 29: 1 Chapter 10 l Vector l Linked Data Structures l interface Dynamic Data Structures

29

Deleting a NodeStep 2

current = current.linkThe node has been deleted from the list although it is still shown in this picture.

“Math"

previous“CS"

“Psy"null

newNode

current

After

"and"

“Math"

previous“CS"

“Psy"null

newNode

current

Before

"and"

This node is not accessible from the head of the list.

Page 30: 1 Chapter 10 l Vector l Linked Data Structures l interface Dynamic Data Structures

30

A doubly linked list allows the program to move backward as well as forward in the list.

The beginning of the node class for a doubly-linked list would look something like this:

private class ListNode{private Object dataprivate ListNode next;private ListNode previous;

A Doubly Linked List

null null

Declaring the data reference as class Object allows any kind of data to be stored in the list.

Page 31: 1 Chapter 10 l Vector l Linked Data Structures l interface Dynamic Data Structures

31

Interfaces A Java interface is a collection of abstract methods and

constants An abstract method is a method header without a method

body (i.e., no implementation) An abstract method in an interface can be declared using the

modifier abstract, but because all methods in an interface are abstract, it is usually left off.» cf: abstract methods in an abstract class must be

declared explicitly using the abstract modifier. An interface is used to formally define a set of methods that

a class will implement

Page 32: 1 Chapter 10 l Vector l Linked Data Structures l interface Dynamic Data Structures

32

Interfaces

public interface Doable{ public void doThis(); public int doThat(); public void doThis2 (float value, char ch); public boolean doTheOther (int num);}

interface is a reserved wordNone of the methods in anNone of the methods in an

interface are giveninterface are givena definition (body)a definition (body)

A semicolon immediatelyA semicolon immediatelyfollows each method headerfollows each method header

Page 33: 1 Chapter 10 l Vector l Linked Data Structures l interface Dynamic Data Structures

33

Interfaces An interface cannot be instantiated

» Doable d = new Doable(); // error Like a class, a user-defined interface can be used as the

type of variables.» Doable a, b;

Methods in an interface have public visibility by default A class formally implements an interface by

» stating so in the class header» providing implementations for each abstract method in

the interface If a class asserts that it implements an interface, it must

define all methods in the interface or the compiler will produce errors.

Page 34: 1 Chapter 10 l Vector l Linked Data Structures l interface Dynamic Data Structures

34

Interfacespublic class CanDo implements Doable{ public void doThis () { // whatever }

public void doThat () { // whatever }

// etc.}

implements is aimplements is areserved wordreserved word

Each method listedEach method listedin Doable isin Doable is

given a definitiongiven a definition

Page 35: 1 Chapter 10 l Vector l Linked Data Structures l interface Dynamic Data Structures

35

Interfaces A class can implement more than one interfaces

The interfaces are listed in the implements clause, separated by commas

The class must implement all methods in all interfaces listed in the header

Page 36: 1 Chapter 10 l Vector l Linked Data Structures l interface Dynamic Data Structures

369

Interfaces

An interface can be implemented by multiple classes

Each implementing class can provide their own unique version of the method definitions

An interface is not part of the class hierarchy A class can be derived from a base class and

implement one or more interfaces

Page 37: 1 Chapter 10 l Vector l Linked Data Structures l interface Dynamic Data Structures

3710

Interface constants

Unlike interface methods, interface constants require nothing special of the implementing class

Constants in an interface can be used in the implementing class as if they were declared locally

This feature provides a convenient technique for distributing common constant values among multiple classes

Page 38: 1 Chapter 10 l Vector l Linked Data Structures l interface Dynamic Data Structures

3811

Extending Interfaces

An interface can be derived from another interface, using the extends reserved word

The child interface inherits the constants and abstract methods of the parent

Note that the interface hierarchy and the class hierarchy are distinct

Unlike class hierarchy, an interface can extend more than one interfaces.» public interface Transformable extends Scable,

Translatable, Rotatable { } A class that implements an interface must define also all

methods in all ancestors of the interface.

Page 39: 1 Chapter 10 l Vector l Linked Data Structures l interface Dynamic Data Structures

39

interface Printable { public String name(); public String print(); // public can be omitted} // interface Printable

class PrintLogger { public void log (Printable file) { System.out.println (file.name() + " : " + file.print()); } // method log} // class PrintLogger

An interface Example

Page 40: 1 Chapter 10 l Vector l Linked Data Structures l interface Dynamic Data Structures

40

class File { protected String id; protected int size; public File (String id, int size) { this.id = id; this.size = size; } // constructor File public String name() { return id; } // method name} // class Fileclass TextFile extends File implements Printable { protected String text; public TextFile (String id, int size, String contents) { super(id, size); text = contents; } // constructor TextFile public String print() { return text; } } // class TextFile

Page 41: 1 Chapter 10 l Vector l Linked Data Structures l interface Dynamic Data Structures

41

class BinaryFile extends File { protected byte[] data; public BinaryFile (String id, int size, byte[] data) { super(id, size); this.data = data; } // constructor BinaryFile} // class BinaryFile

class ImageFile extends BinaryFile implements Printable { public ImageFile (String id, int size, byte[] data) { super(id, size, data); } // constructor ImageFile public String print() { return new String (data); } } // class Image_File

Page 42: 1 Chapter 10 l Vector l Linked Data Structures l interface Dynamic Data Structures

42

public class Printer { public static void main (String[] args) { byte[] logoData = {41, 42, 49, 44 };

TextFile report = new TextFile (“Reprot 1", 1024, "One two three …");

ImageFile logo = new ImageFile(“Picture 1", 4, logoData); PrintLogger daily = new PrintLogger(); daily.log (report); daily.log (logo); }}

Page 43: 1 Chapter 10 l Vector l Linked Data Structures l interface Dynamic Data Structures

43

Marker interface An interface without including any method.

» useful for providing additional information about an object.» EX:» java.lang.Serializable» java.lang.Cloneable» java.rmi.Remote

Ex:

Object obj;Object copy;copy = o.clone() // may raise CloneNotSupportedExceptionexceptionif(obj instanceof Cloneable) copy = o.clone();else copy = null;

Page 44: 1 Chapter 10 l Vector l Linked Data Structures l interface Dynamic Data Structures

44

Polymorphism via Interfaces An interface name can be used as the type of an object

reference variable

Doable obj;

The obj reference can be used to point to any object of any class that implements the Doable interface

The version of doThis that the following line invokes depends on the type of object that obj is referring to:

obj.doThis();

Page 45: 1 Chapter 10 l Vector l Linked Data Structures l interface Dynamic Data Structures

45

Summary Vectors can be thought of as arrays that can grow in

length as needed during run time. The base type of all vectors is Object. Thus, vector elements can be of any class type, but not

primitive types. A linked list is a data structure consisting of objects

known as nodes, such that each node can contain data, and each node has a reference to the next node in the list.

You can make a linked list self-contained by making the node class an inner class of the linked list class.

You can use an iterator to step through the elements of a collection.