Difference between revisions of "ImmutableList Assignment"
(→Apps) |
|||
Line 1: | Line 1: | ||
− | =Code To | + | =Code To Investigate= |
− | == | + | ==interface ImmutableList<E>== |
− | + | ||
− | + | <nowiki>public interface ImmutableList<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 | ||
+ | */ | ||
+ | ImmutableList<E> tail(); | ||
− | + | /** | |
+ | * @return true if empty, false otherwise | ||
+ | */ | ||
+ | boolean isEmpty(); | ||
+ | }</nowiki> | ||
+ | =Code To Implement= | ||
+ | ==Utilities== | ||
===Lists=== | ===Lists=== | ||
{{JavaToImplement|Lists|nil<br/>cons<br/>brackets<br/>|immutable.list.assignment}} | {{JavaToImplement|Lists|nil<br/>cons<br/>brackets<br/>|immutable.list.assignment}} | ||
Line 32: | Line 46: | ||
It is suggested that you adopt a recursive approach to solving this problem. What is the base case? What is the recursive case? | It is suggested that you adopt a recursive approach to solving this problem. What is the base case? What is the recursive case? | ||
+ | |||
+ | ===enum EmptyImmutableList=== | ||
+ | {{JavaToImplement|EmptyImmutableList|constructor<br/>isEmpty<br/>head<br/>tail<br/>|immutable.list.assignment}} | ||
+ | /* package-private */ enum EmptyImmutableList implements [https://www.cse.wustl.edu/~cosgroved/courses/cse425s/spring20/apidocs/immutable/list/core/ImmutableList.html ImmutableList<Object>] | ||
+ | |||
+ | WARNING: you need NOT implement iterator() now. That will be the subject of a future studio. | ||
+ | |||
+ | ===class NonEmptyImmutableList<E>=== | ||
+ | {{JavaToImplement|NonEmptyImmutableList|constructor<br/>isEmpty<br/>head<br/>tail<br/>|immutable.list.assignment}} | ||
+ | /* package-private */ enum EmptyImmutableList implements [https://www.cse.wustl.edu/~cosgroved/courses/cse425s/spring20/apidocs/immutable/list/core/ImmutableList.html ImmutableList<Object>] | ||
+ | |||
+ | WARNING: you need NOT implement iterator() now. That will be the subject of a future studio. | ||
==Apps== | ==Apps== | ||
− | NOTE: Since the constructors on | + | NOTE: Since the constructors on our implementations are package protected, you will need to use [[#nil|nil()]] and [[#cons|cons(head,tail)]]. |
===Length=== | ===Length=== |
Revision as of 09:31, 15 September 2020
Code To Investigate
interface ImmutableList<E>
public interface ImmutableList<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 */ ImmutableList<E> tail(); /** * @return true if empty, false otherwise */ boolean isEmpty(); }
Code To Implement
Utilities
Lists
class: | Lists.java | ![]() |
methods: | nil cons brackets |
|
package: | immutable.list.assignment | |
source folder: | src/main/java |
nil
public static <E> ImmutableList<E> nil()
Constructs a new empty list, analogous to the nil constructor for SML List.
cons
public static <E> ImmutableList<E> cons(E head, ImmutableList<E> tail)
Constructs a new list comprised of head::tail, analogous to the :: constructor for SML List.
brackets
public static <E> ImmutableList<E> brackets(E... elements)
Constructs an ImmutableList<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?
enum EmptyImmutableList
class: | EmptyImmutableList.java | ![]() |
methods: | constructor isEmpty head tail |
|
package: | immutable.list.assignment | |
source folder: | src/main/java |
/* package-private */ enum EmptyImmutableList implements ImmutableList<Object>
WARNING: you need NOT implement iterator() now. That will be the subject of a future studio.
class NonEmptyImmutableList<E>
class: | NonEmptyImmutableList.java | ![]() |
methods: | constructor isEmpty head tail |
|
package: | immutable.list.assignment | |
source folder: | src/main/java |
/* package-private */ enum EmptyImmutableList implements ImmutableList<Object>
WARNING: you need NOT implement iterator() now. That will be the subject of a future studio.
Apps
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.apps.assignment | |
source folder: | src/main/java |
public static <E> int length(ImmutableList<E> list)
SumProductCountdownFactorial
class: | SumProductCountdownFactorial.java | ![]() |
methods: | sum product countdown factorial |
|
package: | immutable.list.apps.assignment | |
source folder: | src/main/java |
sum
public static int sum(ImmutableList<Integer> xs)
product
public static int product(ImmutableList<Integer> xs)
countdown
public static ImmutableList<Integer> countdown(int n)
factorial
public static int factorial(int n)
Concat
class: | Concat.java | ![]() |
methods: | concat | |
package: | immutable.list.apps.assignment | |
source folder: | src/main/java |
public static <E> ImmutableList<E> concat(ImmutableList<E> xs, ImmutableList<E> ys)
Test
class: | ImmutableListTestSuite.java | ![]() |
package: | immutable.list.assignment | |
source folder: | src/test/java |
Pledge, Acknowledgments, Citations
file: | studio-immutable-list-pledge-acknowledgments-citations.txt |
More info about the Honor Pledge