Self-assessment 04: Sample answers

In the first question, you will write a comparator. For example, a question might state:

Write a class DescendingIntegerComparator that implements Comparator<Integer>. If it were used as the argument to List.sort(), it would sort the list in descending order. Note that this question is not asking you to sort a list – just to write the comparator!

For example, if the unsorted list were [2, 1, 4, 3], then the list would be [4, 3, 2, 1] after sorting using this comparator.

public class DescendingIntegerComparator implements Comparator<Integer> {
	public int compare(Integer o1, Integer o2) {
		return -Integer.compare(o1, o2);
	}
}

In the second and third questions, you will write a short class or method according to a textual description. For example, a question might state:

Write a method public static <E> List<E> notIn(List<E> list, Set<E> set). notIn should return a list that contains the elements present in list but not present in set. The original list and set must not be modified. For full credit, your method must correctly use generics, and must not contain unnecessary method calls or loops, even if they do not otherwise impact correctness. You may assume List, Set, ArrayList, and HashSet are correctly imported from java.util. You may not import other classes.

public static <E> List<E> notIn(List<E> list, Set<E> set) {
    List<E> result = new ArrayList<>();
    for (E e: list) {
        if (!set.contains(e)) {
            result.add(e);
        }
    }
    return result;
}

or, if you are a little more fluent in the Java API:

	public static <E> List<E> notIn(List<E> list, Set<E> set) {
	    List<E> result = new ArrayList<>(list);
	    result.removeAll(set);
	    return result;
	}

Another question might state:

Write a generic class MyList<E> that extends an existing implementation of List. MyList should include a method public List<E> reversed(). reversed returns a new list consisting of the elements of the current list in reverse order. reversed must not modify the list. For full credit, your method must correctly use generic types, and must not contain unnecessary method calls or loops, even if they do not otherwise impact correctness. You may assume List and ArrayList are correctly imported from java.util. You may not import other classes.

public class MyList<E> extends ArrayList<E> {
	public List<E> reversed() {
		List<E> reversed = new ArrayList<>();
		for (int i = size() - 1; i >= 0; i--) {
			reversed.add(get(i));
		}
		return reversed;
	}
}