The Vector Class

38
The Vector Class

description

The Vector Class. Vector Class. Write a Vector class. This will be a container class that will hold objects. It should allow the following operations: addAdd an object to the end of the Vector findDetermine if an object is in the Vector getGet a certain element (by number) from the - PowerPoint PPT Presentation

Transcript of The Vector Class

Page 1: The Vector Class

The Vector Class

Page 2: The Vector Class

Vector Class

• Write a Vector class. This will be a container class that will hold objects. It should allow the following operations:

– add Add an object to the end of the Vector – find Determine if an object is in the Vector – get Get a certain element (by number) from the

Vector – insert Insert a new element into a certain position– deleteDelete a certain element from the Vector– size Returns size of Vector

Page 3: The Vector Class

Typical Operation

Vector v;

v = new Vector();

v.add(“Larry”);

v.add(“Moe”);

v.add(“Curly”);

System.out.println

(v.find(“Ned”));

System.out.println

(v.get(1));

v.insert(“Shemp”, 1);

v.delete(2);

for

(int i=0;i<v.size();i++)

System.out.println

(v.get(i));

false

Moe

Larry

Shemp

Curly

Page 4: The Vector Class

Design

• Implementation will be easily accomplished with a linked list.

• We'll assume we have available an LLNode which holds objects and has get/setData and get/setNext methods.

• We'll start with the basic shell and the fields we'll need:

Page 5: The Vector Class

LLNode

class LLNode {

private Object data;

private LLNode next;

public LLNode(Object o) {

setData(o);

setNext(null);

}

public void setData(Object o) {

data = o;

}

public Object getData() {

return data;

}

Page 6: The Vector Class

LLNode

// class LLNode (continued)

public void setNext(LLNode n) {

next = n;

}

public LLNode getNext() {

return next;

}

} // LLNode

Page 7: The Vector Class

Things to notice

• As you get used to any language you will learn a basic shell or template from which to start programs.

• Creating and using such a shell will sometimes aid in getting started

• It’s also a good place to include things that you always forget (e.g. closing braces)

Page 8: The Vector Class

Basics

public class Vector {

private LLNode head;

private int count;

/* ------------------------------------------- */

/** Basic constructor.

<BR><B>Precondition:</B> None.

<BR><B>Postcondition:</B> Vector instantiated

with size set to zero.

*/

public Vector() {

setHead(null);

count = 0;

}

Page 9: The Vector Class

Basics

/** Sets head reference.

<BR><B>Precondition:</B> Instantiation.

<BR><B>Postcondition:</B> head reference set

to newhead

@param newhead New head reference

*/

private void setHead(LLNode newhead) {

head = newhead;

}

Page 10: The Vector Class

Basics

/** Returns head reference.

<BR><B>Precondition:</B> Instantiation.

<BR><B>Postcondition:</B> No change to Vector

@return Head reference

*/

private LLNode getHead() {

return head;

}

Page 11: The Vector Class

Things to Notice

• Make the documentation work for you as opposed to being just a “dumb” requirement that you do after the real work is done.

• Create the documentation in the form of Javadocs

• Create this documentation in a “working” i.e. compilable template

• As each method is written compile and test!

Page 12: The Vector Class

Design by Contract

/** Adds an object to the end of the Vector.

Precondition: Vector has been instantiated.

Postcondition: The last item in the Vector

will be the item added and the Vector will be

one element longer.

@param o The object to be added.

*/

public void add(Object o)

{

} // add

Page 13: The Vector Class

Design by Contract /** Finds the location of an object in the Vector.

Precondition: Vector has been instantiated.

Postcondition: The Vector will be unchanged.

@param o The object to be located. Note: The

target object must return true when tested

with o.equals(target)

@return An value indicating the location of

the item. The first element is numbered 0. A

-1 indicates element not found.

*/

public int find(Object o)

{

return 0;

} // find

Page 14: The Vector Class

Design by Contract /** Gets the n-th element of the Vector and returns it. Precondition: Vector has been instantiated and should have at least n+1 elements. Postcondition: The Vector will be unchanged. @param n The number of the object to be located. Note: The first object in the Vector is numbered 0. @return The desired object. If the Vector is not at least n+1 elements long null will be returned. */ public Object get(int i) { return null; } // get

Page 15: The Vector Class

Design by Contract /** Inserts an object into the Vector at the specified position. If the Vector is not long enough acts like add. @see add <B>Precondition:</B> Vector has been instantiated. <B>Postcondition:</B> The Vector will have one additional element. It will either be in position specified or in the last element in the Vector (whichever is smaller). @param o The object to be inserted. @param n The position into which the object is to be inserted. Note: The first object in the Vector is numbered 0. */ public void insert(Object o, int i) { } // insert

Page 16: The Vector Class

Design by Contract /** Deletes the n-th element of the Vector.

Precondition: Vector has been instantiated

and the n-th element is present.

Postcondition: The Vector will have the n-th

element deleted unless the original Vector

was not long enough to have the n-th element.

@param n The number of the object to be

deleted. Note: The first object in the Vector

is numbered 0.

*/

public void delete(int n)

{

} // delete

Page 17: The Vector Class

Design by Contract

/** Returns the size of the Vector.

Precondition: Vector has been instantiated.

Postcondition: Vector will be unchanged.

@return Size of the Vector.

*/

public int size()

{

return 0;

} // delete

} // Vector

Page 18: The Vector Class

Things to Notice

• Now we go back in a code incrementally• Write a method• Add some code to the test main to test it• TEST IT

Page 19: The Vector Class

/** Adds an object to the end of the Vector.

<BR><B>Precondition:</B> Vector has been

instantiated.

<BR><B>Postcondition:</B> The last item in the

Vector will be the item added and the Vector

will be one element longer.

@param o The object to be added.

*/

public void add(Object o) {

if(getHead() == null) {

setHead(new LLNode(o));

count++;

}

else

add(getHead(), o);

} // add

Typical error...had o insteadof new LLNode(o)

Page 20: The Vector Class

/** Add helper. Called by add. Adds an object to

the end of the Vector.

<BR><B>Precondition:</B> Vector has been

instantiated.

<BR><B>Postcondition:</B> The last item in the

Vector will be the item added and the Vector

will be one element longer.

@param current Current head of list

(recursive).

@param o The object to be added. */

private void add(LLNode current, Object o) {

if(current.getNext() == null) {

current.setNext(new LLNode(o));

count++;

} else

add(current.getNext(), o);

} // add helper

Page 21: The Vector Class

/** Finds the location of an object in the Vector.

<BR><B>Precondition:</B> Vector has been

instantiated.

<BR><B>Postcondition:</B> The Vector will be

unchanged.

@param o The object to be located. Note: The

target object must return true when tested

with o.equals(target)

@return An value indicating the location of

the item. The first element is numbered 0. A

-1 indicates element not found. */

public int find(Object o) {

if(getHead() == null)

return -1;

else

return find(getHead(), o, 0);

} // find

Page 22: The Vector Class

/* ---------------------------------------------*/

/* find helper */

/* ---------------------------------------------*/

private int find(LLNode current, Object o, int k)

{

if(current.getData().equals(o))

return k;

else if(current.getNext() == null)

return -1;

else

return find(current.getNext(), o, k+1);

} // find helper

Page 23: The Vector Class

/** Gets the nth element of the Vector and returns it.

<BR><B>Precondition:</B> Vector has been

instantiated and should have at least n+1 elements.

<BR><B>Postcondition:</B> The Vector will be unchanged.

@param n The number of the object to be located. Note: The first object in the Vector is numbered 0.

@return The desired object. If the Vector is not at least n+1 elements long null will be returned. */

public Object get(int i) {

if(getHead() == null)

return null;

else

return get(getHead(), i, 0);

} // get

Page 24: The Vector Class

/* ---------------------------------------------*/

/* get helper

/* ---------------------------------------------*/

private Object get(LLNode current, int i, int k) {

if(i == k)

return current.getData();

else if(current.getNext() == null)

return null;

else

return get(current.getNext(), i, k+1);

} // get helper

Page 25: The Vector Class

/** Inserts an object into the Vector at the specified position. If the Vector is not long enough acts like add.

<BR><B>Precondition:</B> Vector has been instantiated.

<BR><B>Postcondition:</B> The Vector will have one additional element. It will either be in position

specified or in the last element in the Vector (whichever is smaller).

@param o The object to be inserted. @param n The position into which the object is to be inserted. Note: The first object in the

Vector is numbered 0. */

Page 26: The Vector Class

public void insert(Object o, int i) { if((getHead() == null) || (i == 0)) { LLNode temp = new LLNode(o); temp.setNext(getHead()); setHead(temp); count++; } else insert(getHead(), o, i, 1); } // insert

Page 27: The Vector Class

/* ---------------------------------------------*/

/* insert helper /* ---------------------------------------------*/ private void insert(LLNode current, Object o, int i, int k) { if((current.getNext() == null) || (i == k)) { LLNode temp = new LLNode(o); temp.setNext(current.getNext()); current.setNext(temp); count++; } else insert(current.getNext(), o, i, k+1); } // insert helper

Page 28: The Vector Class

/** Deletes the n-th element of the Vector.

<BR><B>Precondition:</B> Vector has been

instantiated and the n-th element is present.

<BR><B>Postcondition:</B> The Vector will

have the n-th element deleted unless the

original Vector was not long enough to have

the n-th element.

@param n The number of the object to be

deleted. Note: The first object in the Vector

is numbered 0. */

Page 29: The Vector Class

public void delete(int n) {

/* Check to make sure element to be deleted

is in Vector */

if(n < size() && n >= 0) {

if(n == 0) {

setHead(getHead().getNext());

count--;

} else {

delete(getHead(), n, 1);

}

}

} // delete

Page 30: The Vector Class

/** Delete helper. Deletes the n-th element of

the Vector.

<BR><B>Precondition:</B> Vector has been

instantiated.

<BR><B>Postcondition:</B> The Vector will

have the n-th element deleted.

@param current Head of current list

(recursive).

@param n The number of the object to be

deleted. Note: The first object in the Vector

is numbered 0.

@param k Current count.

*/

Note: Javadocs do not by default include private items. However this can be overridden so two versions of Javadocs could be produced: one for internal and one for external use

Note: Javadocs do not by default include private items. However this can be overridden so two versions of Javadocs could be produced: one for internal and one for external use

Page 31: The Vector Class

private void delete(LLNode current, int n, int k){

if(n == k) {

current.setNext(current.getNext().getNext());

count--;

} else {

delete(current.getNext(), n, k+1);

}

} // delete helper

Page 32: The Vector Class

/** Returns the size of the Vector.

<BR><B>Precondition:</B> Vector has been

instantiated.

<BR><B>Postcondition:</B> Vector will be

unchanged.

@return Size of the Vector. */

public int size()

{

return count;

} // size

Page 33: The Vector Class

/** Convert vector into string listing.

<BR><B>Precondition:</B>Instantiation.

<BR><B>Postcondition:</B>No change to Vector.

@return Representation of Vector as list.

*/

public String toString()

{

String retVal = "";

for(int i=0; i < size(); i++)

{

retVal += get(i) + "\n";

}

return retVal;

}

Page 34: The Vector Class

/** Test main. */

public static void main(String args[]) {

Vector v = new Vector();

System.out.println("Should be -1: " +

v.find("Test"));

v.add("Test");

v.add("Test2");

System.out.println("Should be 0: " +

v.find("Test"));

System.out.println("Should be 1: " +

v.find("Test2"));

System.out.println("Should be -1: " +

v.find("Missing"));

Page 35: The Vector Class

/** Test main. */

/* Test get */

System.out.println("Should be Test: " +

v.get(0));

System.out.println("Should be Test2: " +

v.get(1));

if(v.get(2) == null)

System.out.println("Passed get 2 test");

else

System.out.println("Failed get 2 test");

Page 36: The Vector Class

/** Test main. */

/* insert test */

v.insert("NewHead", 0);

v.insert("NewOne", 1);

System.out.println("Start Traversal");

System.out.println(v);

System.out.println("End Traversal");

System.out.println("Size: " + v.size());

Page 37: The Vector Class

/* delete test */ v = new Vector(); v.add("Zero"); v.add("One"); v.add("Two"); v.add("Three"); v.add("Four"); v.add("Five"); System.out.println("Starting vector\n"+v); v.delete(0); System.out.println("Deleted first\n"+v); v.delete(4); System.out.println("Deleted last\n"+v); v.delete(-v.size()); v.delete(v.size()); System.out.println("Should be no change\n"+v); v.delete(1); System.out.println("Two should be gone\n"+ v); } // main} // Vector

Page 38: The Vector Class