Difference between revisions of "ImmutableList Assignment"
Line 54: | Line 54: | ||
=== One Possible Solution === | === One Possible Solution === | ||
− | One approach to supporting the public methods on Lists is a split implementation. | + | One approach to supporting the public methods on Lists is a split implementation: an enum with a single enum constant to serve for all empty lists and a class for non-empty lists. |
[[File:ImList_E_D_C_B_A.svg]] | [[File:ImList_E_D_C_B_A.svg]] |
Revision as of 02:49, 6 February 2022
Contents
Code To Investigate
interface ImList<E>
public interface ImList<E> extends Iterable<E> { /** * @return the head value if it is present * @throws NoSuchElementException if empty */ E head(); /** * @return the tail if it is present * @throws NoSuchElementException if empty */ ImList<E> tail(); /** * @return true if empty, false otherwise */ boolean isEmpty(); }
Code To Implement
Utilities
ImLists
class: | ImLists.java | |
methods: | nil cons brackets |
|
package: | immutable.list.util.exercise | |
source folder: | src/main/java |
This class is the one required class you must support. It creates 3 static methods which are responsible for returning instances of ImList. There is a suggested path below involving a split implementation: one for empty ImLists and one for non-empty ImLists. For now, investigate this file to see what is required and decide whether or not you want to go the suggested route. Either way, you will want to build the supporting unshared enum and/or classes as you build these public static methods.
ALERT: You do not yet need to support the iterator() method on any instance you create. That will be the subject of a future exercise.
nil
public static <E> ImList<E> nil()
Constructs a new empty list, analogous to the nil constructor for SML list datatype.
cons
public static <E> ImList<E> cons(E head, ImList<E> tail)
Constructs a new list comprised of head::tail, analogous to the :: constructor for SML list datatype.
brackets
public static <E> ImList<E> brackets(E... elements)
Constructs an ImList<E> whose contents are defined by the elements passed in.
The parameter E... arguments is an example usage of varargs in Java. You can treat parameter elements as if it is an E[]. The varargs ... simply allows for more convenient invocations of the brackets method.
In order to build this method, consider added a private static helper method to perform the actual work.
It is suggested that you adopt a recursive approach to solving this problem. What is the base case? What is the recursive case?
Note: Be sure to cons your items onto the list from the back to the front.
One Possible Solution
One approach to supporting the public methods on Lists is a split implementation: an enum with a single enum constant to serve for all empty lists and a class for non-empty lists.
enum EmptyImList
class: | EmptyImList.java | |
methods: | constructor isEmpty head tail |
|
package: | immutable.list.util.exercise | |
source folder: | src/main/java |
enum EmptyImList implements ImList<Object>
ALERT: you need NOT implement iterator() now. That will be the subject of a future studio.
constructor
What fields, if any, are required as state for an empty list?
isEmpty
"Hey EmptyImList, are you empty?"
head
Check the behavior of head() dictated by the specification in ImList<E>.
tail
Check the behavior of tail() dictated by the specification in ImList<E>.
class NonEmptyImList<E>
class: | NonEmptyImList.java | |
methods: | constructor isEmpty head tail |
|
package: | immutable.list.util.exercise | |
source folder: | src/main/java |
final class NonEmptyImList<E> implements ImList<E>
ALERT: you need NOT implement iterator() now. That will be the subject of a future studio.
constructor
What fields, if any, are required as state for a non-empty list?
isEmpty
"Hey NonEmptyImList, are you empty?"
head
Check the behavior of head() dictated by the specification in ImList<E>.
tail
Check the behavior of tail() dictated by the specification in ImList<E>.
Clients
NOTE: Since the constructors on our implementations are package protected, you will need to use nil() and cons(head,tail).
Length
class: | Length.java | |
methods: | length | |
package: | immutable.list.clients.exercise | |
source folder: | src/main/java |
public static <E> int length(ImList<E> list)
Compute the length of an arbitrary ImList<E>.
SumProductCountdownFactorial
class: | SumProductCountdownFactorial.java | |
methods: | sum product countdown factorial |
|
package: | immutable.list.clients.exercise | |
source folder: | src/main/java |
sum
public static int sum(ImList<Integer> xs)
Compute the sum of all the items in an ImList<Integer>.
product
public static int product(ImList<Integer> xs)
Compute the produce all the items in an ImList<Integer>.
countdown
public static ImList<Integer> countdown(int n)
Produce a new list which contains the values from n down to 1. For example, countdown(5) would produce the list [5,4,3,2,1].
factorial
public static int factorial(int n)
Can you implement this method using the methods you have already created?
Concat
class: | Concat.java | |
methods: | concat | |
package: | immutable.list.clients.exercise | |
source folder: | src/main/java |
public static <E> ImList<E> concat(ImList<E> xs, ImList<E> ys)
Concatenate one list on to another.
Test
class: | ImListUtilAndClientsTestSuite.java | |
package: | immutable.list | |
source folder: | src/test/java |
Pledge, Acknowledgments, Citations
file: | exercise-im-list-pledge-acknowledgments-citations.txt |
More info about the Honor Pledge