Difference between revisions of "ImmutableList Assignment"

From CSE425S Wiki
Jump to navigation Jump to search
Line 1: Line 1:
 +
=Replace NonEmptyImmutableList equals()=
 +
<nowiki> @Override
 +
public boolean equals(Object o) {
 +
if (this == o) {
 +
return true;
 +
}
 +
if (o == null) {
 +
return false;
 +
}
 +
if (o instanceof ImmutableList) {
 +
ImmutableList<?> that = (ImmutableList<?>) o;
 +
if (that.isEmpty()) {
 +
return false;
 +
} else {
 +
return Objects.equals(head(), that.head()) && Objects.equals(tail(), that.tail());
 +
}
 +
} else {
 +
return false;
 +
}
 +
}</nowiki>
 +
 
=Code To Investigate=
 
=Code To Investigate=
 
==interface [https://www.cse.wustl.edu/~cosgroved/courses/cse425s/current/apidocs/immutable/list/core/ImmutableList.html ImmutableList<E>]==
 
==interface [https://www.cse.wustl.edu/~cosgroved/courses/cse425s/current/apidocs/immutable/list/core/ImmutableList.html ImmutableList<E>]==

Revision as of 18:50, 2 October 2020

Replace NonEmptyImmutableList equals()

	@Override
	public boolean equals(Object o) {
		if (this == o) {
			return true;
		}
		if (o == null) {
			return false;
		}
		if (o instanceof ImmutableList) {
			ImmutableList<?> that = (ImmutableList<?>) o;
			if (that.isEmpty()) {
				return false;
			} else {
				return Objects.equals(head(), that.head()) && Objects.equals(tail(), that.tail());
			}
		} else {
			return false;
		}
	}

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 Java.png
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 Java.png
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.

constructor

What fields, if any, are required as state for an empty list?

isEmpty

Hey EmptyImmutableList, are you empty?

head

Check the behavior of head() dictated by the specification in ImmutableList<E>.

tail

Check the behavior of tail() dictated by the specification in ImmutableList<E>.

class NonEmptyImmutableList<E>

class: NonEmptyImmutableList.java Java.png
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.

constructor

What fields, if any, are required as state for a non-empty list?

isEmpty

Hey NonEmptyImmutableList, are you empty?

head

Check the behavior of head() dictated by the specification in ImmutableList<E>.

tail

Check the behavior of tail() dictated by the specification in ImmutableList<E>.

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 Java.png
methods: length
package: immutable.list.apps.assignment
source folder: src/main/java
public static <E> int length(ImmutableList<E> list)

Compute the length of an arbitrary ImmutableList<E>.

SumProductCountdownFactorial

class: SumProductCountdownFactorial.java Java.png
methods: sum
product
countdown
factorial
package: immutable.list.apps.assignment
source folder: src/main/java

sum

public static int sum(ImmutableList<Integer> xs)

Compute the sum of all the items in an ImmutableList<Integer>.

product

public static int product(ImmutableList<Integer> xs)

Compute the produce all the items in an ImmutableList<Integer>.

countdown

public static ImmutableList<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 Java.png
methods: concat
package: immutable.list.apps.assignment
source folder: src/main/java
public static <E> ImmutableList<E> concat(ImmutableList<E> xs, ImmutableList<E> ys)

Concatenate one list on to another.

Test

class: ImmutableListTestSuite.java Junit.png
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