Note, you will be submitting this lab to Gradescope. It will be due at the end of Fall Break (Sunday October 19th).
The main goals for this lab are:
This lab is a paired programming assignment. What exactly does that mean? You will be optionally working in pairs on the CS lab computers. Each pair will be working on one computer. One person will be the driver and the other person will be the navigator. Here is the rule: the driver controlls the lab computer, but the driver can only type what the navigator tells them to type. For this to work well, each pair should be constantly talking among themselves. After each problem, you will switch roles, the navigator will become the driver and the driver will become the navigator.
Download List.java and ArrayList.java from:
wget https://raw.githubusercontent.com/BMC-CS-151/BMC-CS-151.github.io/main/labs/lab06/ArrayList.java
wget https://raw.githubusercontent.com/BMC-CS-151/BMC-CS-151.github.io/main/labs/lab06/List.java
As we covered briefly in class, the inner class ArrayIterator lets us create iterators
over elements of the ArrayList.
Specifically, the method iterator() creates and returns an Iterator. Study this class before
you continue.
Run checkstyle on these 2 java files. List.java should pass successfully but
ArrayList.java should have 21 errors. Fix these errors.
We included these specific checkstyle errors on purpose. These errors force you to see the difference between clean and unclean code. 3 of these errors also remind you about the difference between primitives and objects. These errors are easy (and should be quick) to fix.
If you don’t remember how to run checkstyle, refer to your previous lab.
iterator()In a new file called TestIterator.java, write JUnit tests
that test the ArrayIterator. You must test each of the
three ArrayIterator methods.
In class we used just Assert.assertTrue. You can use
other types of asserts. See the
documentation for Assert: https://junit.org/junit4/javadoc/latest/org/junit/Assert.html
Make sure that
you test that all of the Exceptions are thrown when
they should be. To test if an exception is throw, you
should useAssert.assertThrows:
“https://junit.org/junit4/javadoc/latest/org/junit/Assert.html#assertThrows(java.lang.Class,%20org.junit.function.ThrowingRunnable)”
Download MyIterator.java from:
wget https://raw.githubusercontent.com/BMC-CS-151/BMC-CS-151.github.io/main/labs/lab06/MyIterator.java
The ArrayIterator only traverses the iterator from the front to back.
MyIterator is a fancy Iterator interface that enables forwards
and backwards traversals.
next(), hasNext() methods are the same as in
ArrayIterator and remove() is very similiar. But it has additional methods specified
in the following sections.
Add a second iterator class within the ArrayList class called
MyListIterator that implements MyIterator. This iterator will be used to traverse the list
in both forward and backward direction. next(), hasNext() methods are the same as in
ArrayIterator and remove() is very similiar. But it has additional methods as specified
below:
boolean hasNext()Returns true if this list iterator has more elements when traversing
the list in the forward direction. (In other words, returns true if next() would return
an element rather than throwing an exception.)
E next()Returns the next element in the list and advances the cursor position. It
throws NoSuchElementException if the iteration has no next element. This method may
be called repeatedly to iterate through the list, or intermixed with calls to previous()
to go back and forth. (Note that alternating calls to next and previous will return the
same element repeatedly.)
boolean hasPrevious()Returns true if this list iterator has more elements when
traversing the list in the backward direction. (In other words, returns true if previous()
would return an element rather than throwing an exception.)
E previous()Returns the previous element in the list and moves the cursor position
backwards. It throws NoSuchElementException if the iteration has no previous
element. This method may be called repeatedly to iterate through the list backwards, or
intermixed with calls to next() to go back and forth. (Note that alternating calls to
next and previous will return the same element repeatedly.)
void remove()Removes from the list the last element that was returned by next()
or previous(). This call can only be made once per call to next or previous. This
method throws IllegalStateException if neither next nor previous have been called,
or remove has already been called after the last call to next or previous. Refer to the
remove() method in ArrayIterator which is very similiar.
void set(E e)Replaces the last element returned by next() or previous() with the
specified element. This call can be made only if remove() has not been called after the
last call to next or previous. This method throws IllegalStateException if neither
next nor previous have been called, or remove has been called after the last call to
next or previous.
MyListIterator in ArrayListAdd in your ArrayList class two methods myListIterator() and myListIterator(int i)
that will make an instance of MyListIterator and position it at the beginning of the list,
and position it right before the i-th index, respectively. These methods should return MyListIterator. These methods are similar to the
iterator() method. Note that indices start with 0.
MyListIteratorIn a new file called TestMyListIterator.java, write JUnit tests
that test the methods in MyListIterator.
removePositionsIn ArrayList, implement a static method
called removePositions that takes in two ArrayLists, L and P, ArrayList
and removes the elements in L that are in
positions specified by P.
Your method signature should be as follows:
public static <E> void removePositions(ArrayList<E> L, ArrayList<Integer> P)
Positions start with 0. For instance, if L contains [3, 10, 8, 5, 12, 67, 25, 22]
and P contains [1, 3, 4, 6], the elements at index 1, 3, 4 and 6 in L should be removed, resulting
in L=[3, 8, 67, 22]. You must use your MyListIterator to implement removePositions - this
is not because of purely pedagogical reasons. Removing multiple items from an ArrayList
is tricky because of the index shifting. Using an iterator will make your life a lot easier. You
may assume P only contains valid indices of L, sorted in ascending order.
removePositionsIn a new file called TestRemovePositions, create at least 10 unit tests
that demonstrate that removePositions work currently. Make sure to include
edge cases in your tests.
In this lab we covered iterators. You gained more experiece using checkstyle, unit testing, and implementing an interface.
You do not need to be signed out by a TA for this lab. You will be submitting your code on Gradescope as part of HW04.
Files to submit include:
ArrayList.javaList.javaMyIterator.javaTestIterator.javaTestMyListIterator.javaTestRemovePositions.java